1. 为什么不推荐使用继承?
虽然继承可以解决代码复用等的问题,但如果继承层次过深、过复杂,也会影响到代码的可维护性,而且实际场景下往往对象都会有某些特性,而导致基类分的越来越细,继承层次越来越深。
2. 为什么推荐使用组合?
上面的问题可以通过组合、接口和委托解决。利用接口抽象出行为定义,通过组合不同的行为来定义具体对象的所有行为,对于通用的行为,可以定义具体实现类实现,并将具体对象的通用行为委托给具体的实现类,以提高代码的复用性。
接口+组合+委托符合矢量化思想,即将物体的特征划分为多个独立变化的维度,互不影响。
3. 如何判断该用组合还是继承?
- 如果类之间的继承结构稳定,层次较浅,继承关系简单,那就可以大胆使用继承,反之,就尽量使用组合来代替继承。
- 某些设计模式会固定搭配继承或组合,比如:装饰者模式、策略模式、组合模式使用了组合,而模版模式使用了继承。
- 某些特殊场景限制必须使用继承。比如入参类型不是接口,为了支持多态,只能采用继承实现。
网友评论