面向对象设计原则,出自《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++ 里,多继承容易出现菱形继承、虚函数冲突。
2158

被折叠的 条评论
为什么被折叠?



