В этой ситуации лучше использовать интерфейс или абстрактный класс?
Я хочу знать, есть ли у меня класс покупок (например, корзина.. процесс оплаты), и я хочу добавить возможность оплаты через paypal..is лучше использовать абстрактный класс Документы или интерфейс Документы, например:
Shopping implements Visa,Paypal
Я предполагаю, что интерфейс является правильным ответом, так как класс Shopping
будет рекомендован как абстрактный класс?
3 answers
Ни то, ни другое.
Shopping
( если вы говорите, что это основная система, например, корзина покупок) должен иметь список поставщиков, которые реализуют/наследуют PaymentProcessor
. Visa
и PayPal
будет реализовывать/наследовать от PaymentProcessor
.
Таким образом, вы можете ввести через некоторую конфигурацию то, что доступно PaymentProcessor
. Таким образом, Shopping
не придется менять, если вы добавите MasterCard
.
Взгляните на принцип единой ответственности.
Просто основываясь на названии вашего класса, я бы предположил, что вам не следует использовать ни то, ни другое. Шаблон, на который вам следует обратить внимание, называется композицией. См. http://en.wikipedia.org/wiki/Object_composition.
Короче говоря, ваш торговый класс "использует" платежный процессор, сам по себе не является таковым (т.Е. Не является отношением "является")
Я бы реализовал ваш класс покупок, чтобы принимать платежный процессор либо при его создании, либо с помощью метода set для объекта.
Вы также можете хотите прочитать о шаблонах проектирования, особенно от Банды четырех.
Ничего из этого, я бы сказал. Было бы лучше иметь класс для каждого способа оплаты. Я бы использовал абстрактный класс Paying
(или аналогичный), который реализует аспекты, используемые всеми методами оплаты. Затем вы могли бы написать интерфейс для каждого метода (на самом деле это не обязательно) и реальную реализацию каждого метода, который расширяет Paying
(и может реализовать Visa
).