我不是OOPS和/或设计模式的专家。
我遇到过这样的情况:一辆带有汽车保险杠贴纸子类的汽车?
如果没有,那么如何将动态属性添加到对象的实例?例如汽车,带保险杠贴纸的汽车等。
并非所有汽车都配有保险杠贴纸。人们可以添加一个保险杠贴纸甚至一个以上的保险杠贴纸。我不能用汽车贴纸,afaik,实施我会强迫我添加贴纸。汽车上的保险杠贴纸是汽车(物体?)创建后出现的一个新属性。
答案 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);
当然,这个解决方案有其自身的优点和缺点。