汽车是否有汽车保险杠贴纸子类?

时间:2011-03-04 08:23:31

标签: oop design-patterns decorator

我不是OOPS和/或设计模式的专家。

我遇到过这样的情况:一辆带有汽车保险杠贴纸子类的汽车?

如果没有,那么如何将动态属性添加到对象的实例?例如汽车,带保险杠贴纸的汽车等。

并非所有汽车都配有保险杠贴纸。人们可以添加一个保险杠贴纸甚至一个以上的保险杠贴纸。我不能用汽车贴纸,afaik,实施我会强迫我添加贴纸。汽车上的保险杠贴纸是汽车(物体?)创建后出现的一个新属性。

5 个答案:

答案 0 :(得分:7)

您可以使用Decorator Design Pattern来处理此类情况。它将允许您“向对象的实例添加动态属性”,这是您提到的,您可以通过“装饰”您的car类,在所有组合中添加任何贴纸或任何其他属性。< / p>

答案 1 :(得分:2)

您正在谈论的Car更改是动态属性。我个人会在Car类中实现一个附件集合,其中一个是BumperSticker。

然后,您可以添加和删除附件,而无需为所有可用选项创建Car子类。

如果您继续沿着继承路线考虑汽车有BumperSticker和Spoilers的情况,那么您将拥有多个继承,这在C ++中是不受欢迎的,而在其他语言中则不可用。

答案 2 :(得分:1)

如果保险杠标签在您的情况下很常见,您可以设置布尔属性(true / false)或字符串(如果是这种情况)。

如果保险杠贴纸很复杂,可能是自己的一类,也许汽车应该实施贴纸? (我指的是Java中的实现)

至于动态,是否可以接受与汽车相关的属性数据库表?

答案 3 :(得分:1)

不要过度复杂化。

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;
};

答案 4 :(得分:0)

实际上,当您购买汽车时,您可以选择汽车本身和一系列选项(音乐,室内装饰等)。在现实生活中,您可以在汽车类中引入“选项”。在一个简单的例子中,它看起来像(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);

当然,这个解决方案有其自身的优点和缺点。