В этой ситуации лучше использовать интерфейс или абстрактный класс?


Я хочу знать, есть ли у меня класс покупок (например, корзина.. процесс оплаты), и я хочу добавить возможность оплаты через paypal..is лучше использовать абстрактный класс Документы или интерфейс Документы, например:

Shopping implements Visa,Paypal

Я предполагаю, что интерфейс является правильным ответом, так как класс Shopping будет рекомендован как абстрактный класс?

Author: hakre, 2011-11-07

3 answers

Ни то, ни другое.

Shopping ( если вы говорите, что это основная система, например, корзина покупок) должен иметь список поставщиков, которые реализуют/наследуют PaymentProcessor. Visa и PayPal будет реализовывать/наследовать от PaymentProcessor.

Таким образом, вы можете ввести через некоторую конфигурацию то, что доступно PaymentProcessor. Таким образом, Shopping не придется менять, если вы добавите MasterCard.

Взгляните на принцип единой ответственности.

 7
Author: Daniel A. White, 2011-11-07 19:01:27

Просто основываясь на названии вашего класса, я бы предположил, что вам не следует использовать ни то, ни другое. Шаблон, на который вам следует обратить внимание, называется композицией. См. http://en.wikipedia.org/wiki/Object_composition.

Короче говоря, ваш торговый класс "использует" платежный процессор, сам по себе не является таковым (т.Е. Не является отношением "является")

Я бы реализовал ваш класс покупок, чтобы принимать платежный процессор либо при его создании, либо с помощью метода set для объекта.

Вы также можете хотите прочитать о шаблонах проектирования, особенно от Банды четырех.

 3
Author: hafichuk, 2011-11-07 19:08:05

Ничего из этого, я бы сказал. Было бы лучше иметь класс для каждого способа оплаты. Я бы использовал абстрактный класс Paying (или аналогичный), который реализует аспекты, используемые всеми методами оплаты. Затем вы могли бы написать интерфейс для каждого метода (на самом деле это не обязательно) и реальную реализацию каждого метода, который расширяет Paying (и может реализовать Visa).

 1
Author: str, 2011-11-07 19:05:29