继承是实现代码重用的有力手段,但是它并非永远是完成这项工作的最佳工具。使用不当会导致软件变得很脆弱。
在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处在同一个程序员的控制之下。
对于专门为了继承而设计,并且具有很好的文档说明的类来说,使用继承也是十分安全的。
然而,对于普通的具体类,进行跨越包边界的继承,则是十分危险的。
组合:不用扩展现有的类,而是在新的类中增加一个私有域,它引用现有类的一个实例。因为现有类变成了新类的一个组件。
新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果。这被称为转发,新类中的方法称为
转发方法。这样得到的类会非常稳固。
回调框架:在回调框架中,对象把自身的引用传递给其他对象,用于后续的调用(“回调”)。因为被包装起来的对象并不知掉
它外面的包装对象,所以它传递一个指向自身的引用(this),回调时避开了外面的包装对象。
只有当子类真正是超类的子类型时,才适合用继承。类A和类B,只有两者之间确实存在“is a”关系的时候,类B才应该扩展类A。
在现有的JDK中,有许多违反这条原则的地方:栈(stack)并不是向量(vector),但是Stack类却继承了Vector类。属性列表
(properties)并不是散列表(hashTable),但是Properties类却继承了HashTable类。