重构手法67:Replace Inheritance with Delegation (以委托取代继承)
2010-08-12 20:29
302 查看
某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉2者之间的继承关系。
动机:继承是个好东西,但有时候它并不是你要的。你常常会遇到这样的情况:一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。或者,你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些protected函数对子类并没有什么意义。
你可以选择容忍,并接受传统说法:子类可以只使用超类功能的一部分。但这样的结果是:代码传达的信息与你的意图南辕北辙,你应该将它去除。
如果以委托取代继承,你可以更清晰地表明:你只需要受委托的一部分功能。接口中的哪一部分应该被使用,哪一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都给出简单,极少可能出错。
动机:继承是个好东西,但有时候它并不是你要的。你常常会遇到这样的情况:一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。或者,你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些protected函数对子类并没有什么意义。
你可以选择容忍,并接受传统说法:子类可以只使用超类功能的一部分。但这样的结果是:代码传达的信息与你的意图南辕北辙,你应该将它去除。
如果以委托取代继承,你可以更清晰地表明:你只需要受委托的一部分功能。接口中的哪一部分应该被使用,哪一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都给出简单,极少可能出错。
相关文章推荐
- 重构手法68:Replace Delegation with Inheritance (以继承取代委托)
- 处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
- Replace Inheritance with Delegation(以继承取代委托)
- 11.11 replace inheritance with delegation(以委托取代继承)
- Replace Delegation with Inheritance(以委托取代继承)
- Replace Delegation with Inheritance (以继承取代委托)
- Replace Inheritance with Delegation (以委托取代继承)
- 重构第8天:使用委托代替继承(Replace Inheritance with Delegation)
- 处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
- 重构手法04:Replace Temp with Query (以查询取代临时变量)
- 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
- 重构改善既有代码设计--重构手法19:Replace Data Value with Object (以对象取代数据值)
- 重构手法53:Replace Constructor with Factory Method (以工厂函数取代构造函数)
- 重构手法47:Replace Parameter with Explicit Methods (以明确函数取代参数)
- 重构手法19:Replace Data Value with Object (以对象取代数据值)
- 重构手法26:Replace Magic Number with SymBolic Constant (以字面常量取代魔法数)
- 重构手法55:Replace Error Code with Exception (以异常取代错误码)
- 重构手法38:Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件表达式)
- 重构手法49:Replace Parameter with Methods (以函数取代参数)
- 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)