12.5 优先使用合成而非继承
其实我们这里又使用到了一条OOP的原则。
Favor Composition over Inheritance.
优先使用对象组合,而不是继承。
OOP的一个重要特点是继承,继承提供了一条避免代码重复的途径,尽管如此,我们还是优先考虑合成,HappyPeople对象合成了Travellable对象,这比继承来的更加灵活。
虽然在重用方面,继承比合成来的更为简单,但其有如下缺点。
1.子类和父类之间是高耦合的
这体现在三个方面。
子类可以看到父类的一些非公有的细节(protected属性和方法),破坏了封装性。
子类的行为和父类的私有性质之间的协作也是直接的,父类可以直接控制子类的行为,父类私有行为的改变有时会给子类的运行带来不可预知的错误。
父类公有性质的改变,直接影响了子类性质的改变。
如果使用合成,只能依赖于它的公有性质,它们之间不会轻易改变这些公有的约定。
2.子类的行为在运行时无法改变
这些行为都是编译时决定的,是静态的。而如果使用合成,只要依赖于接口或者抽象,运行时就可以动态替换这些对象,享受到了依赖于接口/抽象的好处。
在实际开发中,我们不一定孤立地使用它们,有时候往往结合它们,比如我们之前讲解的装饰器模式、组合模式等都是结合使用合成与继承很好的示例。