2013-08-23 5 views
1

Скажем, у меня есть класс Product {string name; double price; ...}Выбор наследования из класса или объявления полей

Так что если я хочу реализовать сезонный или льготный продукт, я могу добавить объявление isPromoted/isSeasonal или я могу создать новый класс, продвигаемыйProduct: Product {...}, seasonalProduct: Продукт {} и многое другое.

Мне сказали, что новички склонны злоупотреблять наследованием и как это зло. Поэтому я не уверен, что в этом случае я считаю неправильным использование. Или, возможно, они оба ошибаются, и лучше использовать интерфейс.

ответ

1

Будет ли продукция просто продвигаться или нет - т.е. - никаких фактических рекламных данных (разные тарифы, даты и т. Д.) - если вам нужно ваше первое решение. В противном случае вам понадобится отношение к классу Promotions, в котором будут храниться такие данные.

Надеюсь, это поможет.

Примечание: это общий ответ программирования, который никогда не использовал Java лично.

1

Одно хорошее эмпирическое правило состоит в том, чтобы отделить то, что не изменилось.

Вы не можете изменить тип во время выполнения, но вы, вероятно, захотите повысить/понизить качество продукта.

Один из вариантов заключается в том, чтобы хранить состояние непосредственно на Продукте в виде полей (но это будет уродливо, если они накапливаются, isLowInStock и т. Д.).

Возможно лучше ОС лечить продукт как объект и отделить состояние isPromoted/isSeasonal по:

  1. Использование в State pattern инкапсулировать состояние (вы можете связать определенное поведение с изменением состояния с Strategy)
  2. экстернализовать государство и совершать служебные звонки

Используйте # 1 для защиты от будущих изменений (т. е. больше полей). # 2, вероятно, перебор.

Пожалуйста, не используйте двойное представление Цены - см this question или google.

+0

Итак, у меня есть еще один вопрос: http://stackoverflow.com/questions/18413954/using-abstract-class-or-interface -в-состояние модель – jingchyu

0

Есть ли сезонные или льготные продукты, которые добавляют атрибуты? Есть ли у них другое поведение? Это то, что управляет наследованием. Я подозреваю, что нет никакой реальной разницы в поведении и никакой реальной разницы в атрибутах, которые они несут.

Следовательно, я бы рассматривал скидку просто как атрибут, который имеет каждый продукт: любой продукт может продаваться и получать скидку, поэтому у меня будет свойство, указывающее текущий процент или сумму скидки (что, вероятно, по умолчанию до нуля или, возможно, это значение равно нулю. То же самое для сезонных: должно ли это быть булевским флагом?

Смежные вопросы