`
youyu4
  • 浏览: 441778 次
社区版块
存档分类
最新评论

设计原则--多用组合少用继承

 
阅读更多

举例说明:

我们知道米饭和豆沙都是(继承)食品,然后我们用米饭包住豆沙放在锅里蒸一下,我们就得到了(派生)粽子。
这样的结构是:
    食品
    /     \
米饭   豆沙
    \     /
     粽子
这是一个菱形,于是被成为钻石问题:如果食品里有一个成员 "好吃程度",那么粽子的"好吃程度"是继承自哪一个呢?
在C++这个支持多继承的语言里面,如果直接使用 

粽子 粽子a;
cout << 粽子a.好吃程度 << endl;


然后就会发现编译器(g++)报错:对成员"好吃程度"的请求有歧义(ambiguous)。
不过好在有3个解决方式:
1。重新定义一个好吃程度覆盖米饭和豆沙的好吃程度。
2。指明是哪个父类的好吃程度:例如  粽子a.米饭::好吃程度  或者  粽子a.豆沙::好吃程度
3。使用虚拟继承(虚基类),详情请STFW。

 

于是我突然想到其实这里如果使用"多用组合,少用继承"的设计原则(很像解决方法2),那么问题就解决拉:

class 粽子: public 食品{
private:
    米饭 米饭a;
    豆沙 豆沙a;
public:
    粽子(){
        好吃程度 = (米饭a.好吃程度 + 豆沙a.好吃程度) / 2; //其实我觉得豆沙a的权值应该大些=.=
    }
};

 

这个哥的UML图也能让我们很好理解:

http://www.cnblogs.com/bluedy1229/archive/2008/11/19/1286692.html

分享到:
评论

相关推荐

    10丨理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?1

    其中,“组合优于继承”是一条广为流传的原则,意味着在设计软件时,我们应该优先考虑使用组合(Composition)而不是继承(Inheritance)。这条原则的提出主要是为了解决继承带来的潜在问题,如代码的可维护性、可...

    面向对象的设计原则及思想

    - 多用组合,少用继承:组合比继承更灵活,更有利于代码的可扩展性。 - 针对抽象编程,不针对实现编程:这样可以使代码更具通用性,适应未来的修改和扩展。 - 保持抽象,不应依赖具体类:依赖于抽象,可以更容易地...

    Head.First 设计模式学习笔记.pdf

    - **多用组合,少用继承**:“多用组合,少用继承。” 继承虽然能简化代码,但也可能导致复杂的类层次结构,增加维护成本。而组合则能够更好地应对变化,提供更多的灵活性。 #### 三、具体设计模式 - **策略模式**...

    《软件秘笈:设计模式那点事》郑阿奇(编者) -电子工业出版社

    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...

    99丨总结回顾:在实际软件开发中常用的设计思想、原则和模式1

    同时,多用组合少用继承可以增加代码的灵活性和可扩展性,因为组合可以动态改变对象的结构,而继承可能导致紧耦合。 设计原则是评价代码质量的重要标准,如SOLID原则、DRY(Don't Repeat Yourself)原则、KISS...

    面向对象设计原则_达内培训

    14. **BBP黑盒原则**:多用类的聚合,少用类的继承。黑盒原则鼓励使用组合而非继承来构建复杂系统,因为组合提供了更好的封装性和灵活性。 15. **DCSP不要构造具体的超类原则**:避免维护具体的超类。这一原则提倡...

    java设计模式选择题复习

    - **多用组合少用继承原则**:优先考虑组合而非继承,以增强灵活性和减少耦合。 - **高内聚-低耦合原则**:每个模块都应该只负责单一的功能,减少模块间的依赖。 #### 观察者模式的推拉差异及其适用场景 - **推...

    设计模式综合训练报告

    **多用组合少用继承**: - 使用组合而非继承来扩展功能。例如,通过组合不同的装饰器来构建不同样式的销售票据,而不是通过继承的方式。 #### 四、源程序简单说明 在提供的部分源代码中,可以看到一个名为 `...

    设计模式汇总(含思维导图)

    3. 多用组合少用继承:组合和聚合能增加系统的灵活性。 4. 高内聚低耦合原则:提高模块的独立性,降低模块间的耦合度。 5. 单一职责原则:一个类应该仅有一个引起它变化的原因。 6. 里氏替换原则:任何基类可以出现...

    Java设计模式综合应用场景

    - 多用组合,少用继承:组合让对象之间的关系更加灵活,避免了单个类过于庞大和复杂的问题。 通过这样的设计,系统能够灵活地应对订单处理中的各种变化,如新的税金政策、积分规则、销售票据格式等,同时也易于...

    java设计模式选择题复习题.pdf

    面向对象设计原则包括开闭原则(对扩展开放,对修改关闭)、依赖倒转原则(依赖于抽象而非具体实现)、多用组合少用继承原则(降低耦合度)、高内聚低耦合原则等。这些原则指导我们写出更高质量的代码。 观察者模式...

    自己总结的设计模式笔记

    合成复用原则是指要少用继承,多用合成关系来实现。合成包括组合、聚合等关系。 4. 依赖倒转原则 依赖倒转原则是指抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。 5. 接口隔离...

    《Head_First设计模式》.pdf

    - **多用组合,少用继承**:使用组合的方式提高代码的复用性和可维护性。 ##### 1.2 实现案例 - **抽象类**: `Character` - **接口**: `WeaponBehavior` - **具体类**: `King`, `Queen`, `Troll`, `Knight` 继承 `...

    UML与面向对象程序设计

    面向对象程序设计倡导的四大基本原则是封装变化、针对接口编程、多用组合、少用继承以及依赖抽象而不是具体类。这些原则帮助开发人员构建出更加灵活、可复用和易于维护的系统。封装变化使得系统的可变部分独立,减少...

    设计模式笔记

    抽象工厂模式同样遵循“开-闭”原则,提倡多用对象组合,少用继承,并且针对抽象编程。 建造者模式,又称为生成器模式,它将复杂对象的构建与其表示分离,使得相同的构建过程可以创建不同的表示。在手机套餐的例子...

    模式大总结使用模式编程

    设计原则强调多用组合,少用继承。继承在编译时固定,不易改变,而组合则可在运行时动态调整。组合通过对象组合可以实现更灵活的设计,而且在管理大量类时,组合往往比继承更加简便。继承和组合都能实现代码复用,但...

    初学必读:61条面向对象设计的经验原则

    59. **使用组合而非继承**:优先考虑使用组合而不是继承,以降低类层次结构的复杂性。 60. **避免过早规划**:在没有明确需求的情况下,避免过早地规划未来可能的功能,以避免不必要的工作。 61. **状态管理**:...

    设计模式.docx

    - **多用组合少用继承**:这种方式提高了灵活性和扩展性,使得新增行为更加容易。 ### 二、观察者模式 #### 问题案例 设想一个天气监测站需要实时更新数据,并向多个客户端推送信息。传统的面向对象设计可能会遇到...

    [设计模式]总结

    3. **多用组合,少用继承**:将变化频繁的功能封装为独立的行为类,通过组合而非继承引入到主类中,以减少代码的耦合度和提高复用性。 4. **松散耦合**:确保类之间的依赖关系最小化,有助于系统的扩展性和可维护性...

    12种常用设计模式C#代码示例

    3、多用组合,少用继承。 4、为了交互对象之间的送耦合设计而努力。 5、类应该对扩展开发,对修改关闭。 6、依赖倒置原则:要依赖抽象,不要依赖具体类。 7、最少知识原则:只和你的密友谈话。 1,策略模式:定义...

Global site tag (gtag.js) - Google Analytics