第十六条 复合优先于继承

  如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上。

  书中举的第一个例子,实现了一个类extends HashSet类,因为缺少对HashSet类的addAll方法的理解(addAll会重复调用add方法),导致多统计了一倍的调用次数,这就是自己的实现限制在父类的实现上。

同时书中还有一个说明,如果超类在后续的版本中增加了一个新的方法, 正好和你的类里新增的方法签名一致(参数列表和函数名一致),但是返回值不一致,那么会出现编译错误(函数签名一致返回值不一致,无法重载)。

使用复合方法可以解决这些问题,书中举得例子,是使用InstrumentedSet类来包装Set实例,统计的步骤在InstrumentedSet中实现,而对Set的操作独立出来,用一个对象来操作

05-06 02:41