举例说明:
我们知道米饭和豆沙都是(继承)食品,然后我们用米饭包住豆沙放在锅里蒸一下,我们就得到了(派生)粽子。
这样的结构是:
食品
/ \
米饭 豆沙
\ /
粽子
这是一个菱形,于是被成为钻石问题:如果食品里有一个成员 "好吃程度",那么粽子的"好吃程度"是继承自哪一个呢?
在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
相关推荐
其中,“组合优于继承”是一条广为流传的原则,意味着在设计软件时,我们应该优先考虑使用组合(Composition)而不是继承(Inheritance)。这条原则的提出主要是为了解决继承带来的潜在问题,如代码的可维护性、可...
- 多用组合,少用继承:组合比继承更灵活,更有利于代码的可扩展性。 - 针对抽象编程,不针对实现编程:这样可以使代码更具通用性,适应未来的修改和扩展。 - 保持抽象,不应依赖具体类:依赖于抽象,可以更容易地...
- **多用组合,少用继承**:“多用组合,少用继承。” 继承虽然能简化代码,但也可能导致复杂的类层次结构,增加维护成本。而组合则能够更好地应对变化,提供更多的灵活性。 #### 三、具体设计模式 - **策略模式**...
1.3.3 多用组合少用继承 1.3.4 “开-闭”原则 1.4 设计模式概述 1.4.1 什么是设计模式 1.4.2 为什么需要设计模式 1.4.3 如何正确应用设计模式 1.5 设计模式的分类 1.5.1 创建型模式 1.5.2 结构型模式 1.5.3...
同时,多用组合少用继承可以增加代码的灵活性和可扩展性,因为组合可以动态改变对象的结构,而继承可能导致紧耦合。 设计原则是评价代码质量的重要标准,如SOLID原则、DRY(Don't Repeat Yourself)原则、KISS...
14. **BBP黑盒原则**:多用类的聚合,少用类的继承。黑盒原则鼓励使用组合而非继承来构建复杂系统,因为组合提供了更好的封装性和灵活性。 15. **DCSP不要构造具体的超类原则**:避免维护具体的超类。这一原则提倡...
- **多用组合少用继承原则**:优先考虑组合而非继承,以增强灵活性和减少耦合。 - **高内聚-低耦合原则**:每个模块都应该只负责单一的功能,减少模块间的依赖。 #### 观察者模式的推拉差异及其适用场景 - **推...
**多用组合少用继承**: - 使用组合而非继承来扩展功能。例如,通过组合不同的装饰器来构建不同样式的销售票据,而不是通过继承的方式。 #### 四、源程序简单说明 在提供的部分源代码中,可以看到一个名为 `...
3. 多用组合少用继承:组合和聚合能增加系统的灵活性。 4. 高内聚低耦合原则:提高模块的独立性,降低模块间的耦合度。 5. 单一职责原则:一个类应该仅有一个引起它变化的原因。 6. 里氏替换原则:任何基类可以出现...
- 多用组合,少用继承:组合让对象之间的关系更加灵活,避免了单个类过于庞大和复杂的问题。 通过这样的设计,系统能够灵活地应对订单处理中的各种变化,如新的税金政策、积分规则、销售票据格式等,同时也易于...
面向对象设计原则包括开闭原则(对扩展开放,对修改关闭)、依赖倒转原则(依赖于抽象而非具体实现)、多用组合少用继承原则(降低耦合度)、高内聚低耦合原则等。这些原则指导我们写出更高质量的代码。 观察者模式...
合成复用原则是指要少用继承,多用合成关系来实现。合成包括组合、聚合等关系。 4. 依赖倒转原则 依赖倒转原则是指抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。 5. 接口隔离...
- **多用组合,少用继承**:使用组合的方式提高代码的复用性和可维护性。 ##### 1.2 实现案例 - **抽象类**: `Character` - **接口**: `WeaponBehavior` - **具体类**: `King`, `Queen`, `Troll`, `Knight` 继承 `...
面向对象程序设计倡导的四大基本原则是封装变化、针对接口编程、多用组合、少用继承以及依赖抽象而不是具体类。这些原则帮助开发人员构建出更加灵活、可复用和易于维护的系统。封装变化使得系统的可变部分独立,减少...
抽象工厂模式同样遵循“开-闭”原则,提倡多用对象组合,少用继承,并且针对抽象编程。 建造者模式,又称为生成器模式,它将复杂对象的构建与其表示分离,使得相同的构建过程可以创建不同的表示。在手机套餐的例子...
设计原则强调多用组合,少用继承。继承在编译时固定,不易改变,而组合则可在运行时动态调整。组合通过对象组合可以实现更灵活的设计,而且在管理大量类时,组合往往比继承更加简便。继承和组合都能实现代码复用,但...
59. **使用组合而非继承**:优先考虑使用组合而不是继承,以降低类层次结构的复杂性。 60. **避免过早规划**:在没有明确需求的情况下,避免过早地规划未来可能的功能,以避免不必要的工作。 61. **状态管理**:...
- **多用组合少用继承**:这种方式提高了灵活性和扩展性,使得新增行为更加容易。 ### 二、观察者模式 #### 问题案例 设想一个天气监测站需要实时更新数据,并向多个客户端推送信息。传统的面向对象设计可能会遇到...
3. **多用组合,少用继承**:将变化频繁的功能封装为独立的行为类,通过组合而非继承引入到主类中,以减少代码的耦合度和提高复用性。 4. **松散耦合**:确保类之间的依赖关系最小化,有助于系统的扩展性和可维护性...
3、多用组合,少用继承。 4、为了交互对象之间的送耦合设计而努力。 5、类应该对扩展开发,对修改关闭。 6、依赖倒置原则:要依赖抽象,不要依赖具体类。 7、最少知识原则:只和你的密友谈话。 1,策略模式:定义...