11.11 replace inheritance with delegation(以委托取代继承)
2011-10-19 11:29
330 查看
某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。
在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。
动机:
一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些protected函数对子类并没有意义。
如果以委托取代继承,可以更清楚地表明,你只需要受托类的一部分功能。接口中的那一部分应该被使用,那一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都非常简单。
做法:
在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this。
修改子类内的所有函数,让它们不再使用超类,转而使用上述那个受托字段。
去除两个类之间的继承关系,新建一个受托类的对象赋给受托字段。
针对客户端所用的每一个超类函数,为它添加一个简单的委托函数。
旧代码
新代码
在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。
动机:
一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些protected函数对子类并没有意义。
如果以委托取代继承,可以更清楚地表明,你只需要受托类的一部分功能。接口中的那一部分应该被使用,那一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都非常简单。
做法:
在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this。
修改子类内的所有函数,让它们不再使用超类,转而使用上述那个受托字段。
去除两个类之间的继承关系,新建一个受托类的对象赋给受托字段。
针对客户端所用的每一个超类函数,为它添加一个简单的委托函数。
旧代码
class MyStack extends Vector{ public void push(Object element){ insertElementAt(element, 0); } public Object pop(){ Object result = firstElement(); removeElement(0); return result; } }
新代码
private Vector _vector = this; public void push(Object element){ _vector.insertElementAt(element, 0); } public Object pop(){ Object result = _vector.firstElement(); _vector.removeElementAt(0); return result; } public int size(){ return -vector.size(); } public boolean isEmpty(){ return _vector.isEmpty(); }
相关文章推荐
- 重构手法68:Replace Delegation with Inheritance (以继承取代委托)
- Replace Inheritance with Delegation(以继承取代委托)
- Replace Delegation with Inheritance (以继承取代委托)
- Replace Inheritance with Delegation (以委托取代继承)
- 处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
- 处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
- Replace Delegation with Inheritance(以委托取代继承)
- 重构手法67:Replace Inheritance with Delegation (以委托取代继承)
- 重构第8天:使用委托代替继承(Replace Inheritance with Delegation)
- 设计模式:Inheritance(继承) 和 Delegation(委托)
- c++面向对象之复合(composition)、委托(delegation)、继承(inheritance)--(boolan)
- 重构手法19:Replace Data Value with Object (以对象取代数据值)
- Replace Method with Method Object(以函数对象取代函数)
- 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
- 重构手法38:Replace Nested Conditional with Guard Clauses (以卫语句取代嵌套条件表达式)
- Replace Array with Object (以对象取代数组)
- java重构学习7:以函数对象取代函数(Replace Method with Method Object)
- 9.6 replace conditional with polymorphism (以多态取代条件表达式)
- 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)
- Replace Temp With Query(以查询取代临时变量)