2011-03-04 85 views
5

我不是OOPS和/或设计模式方面的专家。是一款带汽车保险杠贴纸子类的汽车吗?

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

如果不是那么我该如何添加动态属性到对象的实例?例如一辆汽车,一辆带保险杠贴纸的汽车等。

并非所有的汽车都有保险杠贴纸。你可以添加一个保险杠贴纸,甚至不止一个保险杠贴纸。我无法实现与汽车贴纸,afaik,执行我会迫使我添加贴纸。汽车上的保险杠贴纸是汽车(物体?)创建后诞生的一种新物业。

+0

取决于您对保险杠贴纸的看法。不得不为汽车的每一分钟变化(扰流板,雪地轮胎,天线)划分子类是一件痛苦的事情。这个问题不是真的可以回答。 – 2011-03-04 08:28:40

+1

不 - 一辆贴有标签的汽车仍然是一辆汽车 - 也许它的一个属性发生了变化,但它不是一个子类,我认为。 – 2011-03-04 08:29:12

+3

请回答以下问题:每辆车都可以有保险杠贴纸吗?带有保险杠标签的汽车的行为与没有汽车的行为有什么不同?如果一辆汽车有几辆车,预计行为会发生什么变化? – Philipp 2011-03-04 08:40:22

回答

7

对于这种情况,您可以使用Decorator Design Pattern。它可以让你“为对象的实例添加动态属性”,这就是你所提到的,你可以通过“装饰”你的car类在所有可能的组合中添加任何贴纸或任何其他属性。

+0

谢谢:)我将花一些时间与咖啡的例子 – Kumar 2011-03-04 13:59:01

1

如果在你的情况下保险杠贴纸是常见的事情,你可以设置一个布尔属性(真/假)或字符串,如果这是你的情况。

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

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

+0

我认为关键是,如上所述,是足够需要一类自己的保险杠贴纸复杂?您是否记录存在保险杠贴纸或其细节?否则只需要一个布尔值为0或更多的贴纸,整数为一个计数等。 – Karl 2011-03-04 08:39:31

+0

这不会导致一个很好的设计,保险杠贴纸是完全可选的,但可以有一辆车甚至自行车,如果它足够小 – Kumar 2011-03-04 08:42:54

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

当然,这种解决方案有它自己的优点和缺点,任何其他。

+0

可以你列举了利弊? – Kumar 2011-03-04 08:41:03

+0

亲:简单; con:只有一个布尔指示表明已经设置了一个选项,不能存储其他信息(例如打印在贴纸上的内容) – Tony 2011-03-04 08:44:49

+0

优点:使用起来非常简单,当你有很多选项时(非1或2但10或20)。缺点:如果Bumper本身很复杂,那么您可能应该使用其他解决方案。这取决于。 – maverik 2011-03-04 08:50:13

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

保险杠贴纸是一个例子,我可以添加许多其他属性,所以根据您的需要,我需要为所有这些属性设置hasProprtyXYZ()方法,这里是有些东西只是卡住了我 'code' class car { \t private propertyarray; \t公共hasProperty(PROPERTYNAME){返回(isset(this.proprtyarray [PROPERTYNAME])真:假);} \t公共的setProperty(PROPERTYNAME,值){this.proprtyarray [PROPERTYNAME] =值;}} ' 代码' – Kumar 2011-03-04 08:48:14

2

到汽车,你所谈论的变化是动态的属性。就我个人而言,我将在Car类中实施一系列配件,其中一个将是BumperSticker。

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

如果沿着继承路线走下去考虑一辆汽车有BumperSticker和Spoilers的情况,那么您将拥有多重遗传,这在C++中是令人不悦的,并且在其他语言中不可用。

+0

在这种情况下,它也被忽视*,因为带保险杠贴纸的汽车和带扰流板的汽车并不是两种不同类型的汽车。他们是单一类型汽车的属性。 – 2011-03-04 09:06:13

+0

确切地说,保险杠贴纸只是您的汽车可能拥有且我可能缺少的汽车的“另一个”属性或属性 – Kumar 2011-03-04 09:21:39