Replace Delegation with Inheritance(以委托取代继承)
2017-06-20 10:05
801 查看
某个子类只用超类接口中的一部分,或是根本不需要继承而来的数据。
在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/699b0b0d51c64bdaea0d4cf7b0132749)
你可以选择容忍,并接受传统说法:子类可以只使用超类功能的一部分。单着中做的结果是:代码传达的信息与你的意图南辕北辙—-这是一种混淆,你应该将它去除。
如果以委托取代继承,你可以更清楚地表明:你只需要受委托类的一部分功能。接口中的那一部分应该被使用,那一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都非常简单,极少可能出错的。
修改子类内的所有函数,让它们不再使用超类,转而使用上述那些受托字段。每次修改后,编译并测试。
1)你不能这样修改子类通过super调用超类函数的代码,否则它们会陷入无限递归。这种函数只有在继承关系被打破后才能修改。
去掉两个类之间的继承关系,新建一个委托类的对象赋给受托字段。
针对客户端所用的每一个超类函数,为它添加一个简单的为它函数。
编译,测试。
在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系
1.动机
继承是个好东西,但有时候它并不是你要的。你常常会遇到这样的情况:①.一开始继承了一个类,随后发现超类中许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。②.你可能发现从超类中继承了一大堆子类并不需要的数据。③.你可能发现超类中的某些protected函数对子类并没有什么意义。你可以选择容忍,并接受传统说法:子类可以只使用超类功能的一部分。单着中做的结果是:代码传达的信息与你的意图南辕北辙—-这是一种混淆,你应该将它去除。
如果以委托取代继承,你可以更清楚地表明:你只需要受委托类的一部分功能。接口中的那一部分应该被使用,那一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都非常简单,极少可能出错的。
2.做法
在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this。修改子类内的所有函数,让它们不再使用超类,转而使用上述那些受托字段。每次修改后,编译并测试。
1)你不能这样修改子类通过super调用超类函数的代码,否则它们会陷入无限递归。这种函数只有在继承关系被打破后才能修改。
去掉两个类之间的继承关系,新建一个委托类的对象赋给受托字段。
针对客户端所用的每一个超类函数,为它添加一个简单的为它函数。
编译,测试。
相关文章推荐
- 处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
- 处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
- 重构手法67:Replace Inheritance with Delegation (以委托取代继承)
- Replace Inheritance with Delegation(以继承取代委托)
- 重构手法68:Replace Delegation with Inheritance (以继承取代委托)
- 11.11 replace inheritance with delegation(以委托取代继承)
- Replace Delegation with Inheritance (以继承取代委托)
- Replace Inheritance with Delegation (以委托取代继承)
- 重构第8天:使用委托代替继承(Replace Inheritance with Delegation)
- c++面向对象之复合(composition)、委托(delegation)、继承(inheritance)--(boolan)
- 设计模式:Inheritance(继承) 和 Delegation(委托)
- 8.5 replace array with object (以对象取代数组)
- 6.4 Replace Temp with Query(以查询取代临时变量)
- 重构手法30:Replace Type Code with Class (以类取代类型码)
- 重新组织数据之二 :Replace Data Value with Object(以对象取代数据值)
- 简化条件表达式之六 :Replace Conditional with Polymorphism(以多态取代条件式)
- java重构学习7:以函数对象取代函数(Replace Method with Method Object)
- 8.2 Replace Data Value with Object(以对象取代数据值)
- 重构8-Replace Inheritance with Delegation(委托替换继承)
- Replace Temp With Query(以查询取代临时变量)