理解《优先使用对象组合而不是继承》

面向对象设计原则,出自《Design Patterns(设计模式)》里的一句金句:
“Favor composition over inheritance.”(优先使用组合,而不是继承)。


1. 继承 (Inheritance) 的特点

class Animal {
public:
    void eat();
};

class Dog : public Animal {
public:
    void bark();
};
  • 子类复用了父类代码。

  • 但是:

    • 强耦合:子类依赖父类的实现。

    • 继承层次一旦定死,修改父类可能影响所有子类

    • 不好扩展(比如 C++ 是单继承,但想同时有“动物行为”和“游泳能力”,就麻烦了)。


2. 组合 (Composition) 的特点

组合就是 把别的类当成员变量用

class Animal {
public:
    void eat();
};

class BarkAbility {
public:
    void bark();
};

class Dog {
private:
    Animal animal;        // 组合
    BarkAbility ability;  // 组合
public:
    void eat() { animal.eat(); }
    void bark() { ability.bark(); }
};
  • Dog 不是继承 Animal,而是 拥有一个 Animal 对象

  • 行为可以通过组合不同“能力类”自由拼接。


3. 为什么要优先组合?

  • 灵活:不用被死板的继承树困住,能在运行时决定“有什么能力”。

  • 低耦合:组合只依赖接口,不依赖具体实现,父类改了,组合的类影响小。

  • 扩展性更强:继承是“编译期绑定”,组合可以“运行时替换”。

  • 避免多继承的问题:特别在 C++ 里,多继承容易出现菱形继承、虚函数冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值