继承是is-a(是什么)关系,而组合是has-a(有什么或用什么)关系。
继承的优点是:
- 重用父类代码
- 可以覆盖父类的方法,从而为子类定制特有的行为
继承的缺点是:
- 可能继承了不必要的行为和属性,造成方法污染
- 在单根继承的语言中只能继承一个父类
- 从父类继承的方法是静态的,无法在运行时改变
- 如果父类修改了,子类可能也要做出相应变化
- 继承是对扩展关闭,对修改开放
使用继承的条件:
- 是is-a关系
- 父类中所有的属性和方法在子类都适用
- 子类不需要去重用别的类的代码
在开发中,我们要遵循单一职责原则,即一个类只负责一件事,再用组合/聚合的方法将这些单一职责的类放在一起完成复杂的业务功能。单一职责的类可以根据业务需要组合在一起,这样在修改某一类的时候最多只修改一部其他代码。
因此,组合要比继承拥有更好的可扩展性和解耦性。