组合优先于继承

组合优于继承

概述

对于继承而言,这是代码复用的一种有效途径。在同一个包中使用继承是安全的,另外,如果类是专门设计来被继承而且具有良好文档,那么采用继承进行扩展也是安全的。请注意,尽量不要跨包去继承一个普通具体的类。

继承违反了封装的原则

一个子类依赖于父类的实现细节来实现本身的功能,这样随着父类的变化,子类将会被破坏。即便子类本身代码没有发生变化,它都必须随着父类演化。

这两个问题——子类实现依赖于父类实现,父类添加方法可能出现漏洞。

组合

为了避免上面的问题,可以让新类包含一个私有域,这个域指向现有类的一个实例。因为现有类成为了新类组件,新类的每个实例方法调用现有类实例的对应方法然后返回值,这就叫转发。

包装者对象几乎没有缺点,但需要注意的是包装者对象不适合于回调框架。因为在回调框架里,对象需要将自身引用传给别的对象,以便别的对象在后续进行调用。因为被包装对象并不知道自己的包装者,它将一个引用传给自己同时回调也避开了包装者。

总结

继承虽然强大,但它存在一些问题,违反了封装,只有父类和子类之间存在真正的父子关系才会使用。为了避免子类的脆弱性,我们应该使用组合和转发,而不是继承。