设计准则-多用组合少用继承
设计原则--多用组合少用继承
举例说明:
我们知道米饭和豆沙都是(继承)食品,然后我们用米饭包住豆沙放在锅里蒸一下,我们就得到了(派生)粽子。
这样的结构是:
食品
/ \
米饭 豆沙
\ /
粽子
这是一个菱形,于是被成为钻石问题:如果食品里有一个成员 "好吃程度",那么粽子的"好吃程度"是继承自哪一个呢?
在C++这个支持多继承的语言里面,如果直接使用
粽子 粽子a;
cout << 粽子a.好吃程度 << endl;
cout << 粽子a.好吃程度 << endl;
然后就会发现编译器(g++)报错:对成员"好吃程度"的请求有歧义(ambiguous)。
不过好在有3个解决方式:
1。重新定义一个好吃程度覆盖米饭和豆沙的好吃程度。
2。指明是哪个父类的好吃程度:例如 粽子a.米饭::好吃程度 或者 粽子a.豆沙::好吃程度
3。使用虚拟继承(虚基类),详情请STFW。
于是我突然想到其实这里如果使用"多用组合,少用继承"的设计原则(很像解决方法2),那么问题就解决拉:
class 粽子: public 食品{
private:
米饭 米饭a;
豆沙 豆沙a;
public:
粽子(){
好吃程度 = (米饭a.好吃程度 + 豆沙a.好吃程度) / 2; //其实我觉得豆沙a的权值应该大些=.=
}
};
private:
米饭 米饭a;
豆沙 豆沙a;
public:
粽子(){
好吃程度 = (米饭a.好吃程度 + 豆沙a.好吃程度) / 2; //其实我觉得豆沙a的权值应该大些=.=
}
};
这个哥的UML图也能让我们很好理解:
http://www.cnblogs.com/bluedy1229/archive/2008/11/19/1286692.html