Является ли автомобиль с наклейкой на бампер подклассом автомобиля? - PullRequest
5 голосов
/ 04 марта 2011

Я не эксперт в OOPS и / или шаблонах проектирования.

Я сталкивался с такой ситуацией: подкласс автомобиля - подкласс автомобиля?

Если нет, то как я могу добавить динамические свойства к экземпляру объекта?Например, автомобиль, автомобиль с наклейкой на бампер и т. Д.

Не все автомобили поставляются с наклейкой на бампер.Можно добавить наклейку на бампер и даже более одной наклейки на бампер.Я не могу реализовать наклейку с автомобилем, afaik, реализация меня заставит меня добавлять наклейки.Наклейка на бампер на автомобиль - это новое свойство, появившееся после создания автомобиля (объекта?).

Ответы [ 5 ]

7 голосов
/ 04 марта 2011

Вы можете использовать Шаблон оформления Decorator для подобных случаев. Это позволит вам «добавить динамические свойства к экземпляру объекта», о чем вы упомянули, вы можете добавить любое количество наклеек или любое другое свойство во всех возможных комбинациях, «украсив» свой car класс.

2 голосов
/ 04 марта 2011

Изменения в Car, о которых вы говорите, являются динамическими атрибутами.Лично я бы реализовал коллекцию аксессуаров в классе Car, одним из которых был бы BumperSticker.

После этого вы можете добавлять и удалять аксессуары, не имея подкласса Car для всех доступных опций.

Если вы пойдете по пути наследования, подумайте о ситуации, когда у автомобиля есть BumperSticker и Spoilers, у вас будет множественное наследование, которое не одобряется в C ++ и недоступно на других языках.

1 голос
/ 04 марта 2011

Не переусердствуйте.

class Car
{
public:
    bool hasBumperSticker() const { return m_hasBumperSticker; }

private:
    bool m_hasBumperSticker;
};

Или, если наклейка на бампере имеет свои свойства:

class Car
{
public:
    bool hasBumperSticker() const { return m_bumperSticker != 0; }

private:
    BumperSticker* m_hasBumperSticker;
};
1 голос
/ 04 марта 2011

Если наклейка на бампере является обычным явлением в вашем случае, вы можете установить логический атрибут (true / false) или строку, если это так в вашем случае.

Если наклейка на бампер сложна, чтобы быть отдельным классом, возможно, автомобиль должен реализовать наклейку? (Я имею в виду реализацию в Java здесь)

Что касается Dynamic, будет ли приемлема таблица базы данных свойств автомобиля?

0 голосов
/ 04 марта 2011

На самом деле, когда вы покупаете автомобиль, вы выбираете сам автомобиль и набор опций (музыка, интерьер и т. Д.). Как и в реальной жизни, вы можете ввести «варианты» в своем классе автомобиля. В простом случае это выглядит так (C ++):

class Car {

    enum CarOptions {
      Bumper,
      ...
    };

    ...

    int options() const { return m_options; }
    void setOptions(int options) { m_options = options }

    ...
};

Car c;
c.setOptions(c.options() | Car::Bumper);

Конечно, у этого решения есть свои плюсы и минусы, как и у любого другого.

...