坏味道——被拒绝的馈赠(Refused Bequest)

特征

子类仅仅使用父类中的部分方法和属性。其他来自父类的馈赠成为了累赘。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

问题原因

有些人仅仅是想重用超类中的部分代码而创建了子类。但实际上超类和子类完全不同。

解决方法

  • 如果继承没有意义并且子类和父类之间确实没有共同点,可以运用 以委托取代继承(Replace Inheritance with Delegation) 消除继承。
  • 如果继承是适当的,则去除子类中不需要的字段和方法。运用 提炼超类(Extract Superclass) 将所有超类中对于子类有用的字段和函数提取出来,置入一个新的超类中,然后让两个类都继承自它。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

收益

  • 提高代码的清晰度和组织性。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

重构方法说明

以委托取代继承(Replace Inheritance with Delegation)

问题

某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

解决

  1. 在子类中新建一个字段用以保存超类;
  2. 调整子类函数,令它改而委托超类;
  3. 然后去掉两者之间的继承关系。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

提炼超类(Extract Superclass)

问题

两个类有相似特性。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

解决

为这两个类建立一个超类,将相同特性移至超类。

代码的坏味道(8)——被拒绝的馈赠(Refused Bequest)-LMLPHP

引申阅读

欢迎继续阅读 代码的症与药 系列文章。

05-11 09:33
查看更多