对比
| 维度 | 继承 | 组合 |
|---|---|---|
| 绑定时机 | 编译期 | 运行期可替换 |
| 封装 | 子类依赖父类实现细节 | 只依赖被组合对象的接口 |
| 变化影响 | 父类改动波及全部子类 | 替换实现即可 |
| 适用 | 稳定且真实的 is-a | 行为复用与策略变化 |
GoF 在《设计模式》中即建议优先使用对象组合;策略、装饰器等模式都是这一原则的体现。
优先通过对象组合与委托复用行为,而非继承:继承在编译期绑定、破坏封装且层级僵化;当类型关系稳定且确实存在 is-a 语义时才考虑继承。
| 维度 | 继承 | 组合 |
|---|---|---|
| 绑定时机 | 编译期 | 运行期可替换 |
| 封装 | 子类依赖父类实现细节 | 只依赖被组合对象的接口 |
| 变化影响 | 父类改动波及全部子类 | 替换实现即可 |
| 适用 | 稳定且真实的 is-a | 行为复用与策略变化 |