坏味道——被拒绝的馈赠(Refused Bequest)
特征
子类仅仅使用父类中的部分方法和属性。其他来自父类的馈赠成为了累赘。
问题原因
有些人仅仅是想重用超类中的部分代码而创建了子类。但实际上超类和子类完全不同。
解决方法
- 如果继承没有意义并且子类和父类之间确实没有共同点,可以运用
以委托取代继承(Replace Inheritance with Delegation)
消除继承。 - 如果继承是适当的,则去除子类中不需要的字段和方法。运用
提炼超类(Extract Superclass)
将所有超类中对于子类有用的字段和函数提取出来,置入一个新的超类中,然后让两个类都继承自它。
收益
- 提高代码的清晰度和组织性。
重构方法说明
以委托取代继承(Replace Inheritance with Delegation)
问题
某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。
解决
- 在子类中新建一个字段用以保存超类;
- 调整子类函数,令它改而委托超类;
- 然后去掉两者之间的继承关系。
提炼超类(Extract Superclass)
问题
两个类有相似特性。
解决
为这两个类建立一个超类,将相同特性移至超类。
引申阅读
欢迎继续阅读 代码的症与药 系列文章。