组合优于继承
在面向对象编程中,"组合优于继承"(Composition Over Inheritance)是一条非常重要的设计原则。这个原则建议我们优先使用组合而不是继承来实现代码复用和功能扩展。
为什么不推荐使用继承?
虽然继承是面向对象的四大特性之一,可以用来表示类之间的 is-a 关系并实现代码复用,但它也存在以下问题:
- 继承层次过深:当继承关系变得复杂时,代码的可读性会变差
- 破坏封装性:子类会暴露父类的实现细节
- 强耦合:子类与父类高度耦合,父类的修改会影响所有子类
- 功能组合爆炸:当类需要多个不同维度的功能时,继承层次会急剧增加
示例:鸟类继承的问题
// 不好的设计
abstract class AbstractBird {
fly(): void {
// 实现飞行逻辑
}
}
class Ostrich extends AbstractBird {
// 问题:鸵鸟不会飞,但继承了 fly 方法
fly(): void {
throw new Error("I can't fly!");
}
}
组合的优势
组合相比继承具有以下优势:
- 更灵活的代码复用:可以动态地组合不同的功能
- 更好的封装性:不会暴露不必要的实现细节
- 松耦合:组件之间的依赖更少
- 更容易扩展