11.11 replace inheritance with delegation(以委托取代继承)
来源:互联网 发布:廊坊银行网络账户 编辑:程序博客网 时间:2024/06/06 00:49
某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。
在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。
动机:
一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些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();}
- 11.11 replace inheritance with delegation(以委托取代继承)
- Replace Inheritance with Delegation(以继承取代委托)
- Replace Delegation with Inheritance(以委托取代继承)
- 处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
- 处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
- Refactoring Day 8 : Replace Inheritance with Delegation
- 设计模式:Inheritance(继承) 和 Delegation(委托)
- c++面向对象之复合(composition)、委托(delegation)、继承(inheritance)--(boolan)
- Replace Temp With Query(以查询取代临时变量)
- Replace Method with Method Object(以函数对象取代函数)
- Replace Data Value with Object(以对象取代数据值)
- Replace Array with Object(以对象取代数组)
- Replace Record with Data Class(以数据类取代记录 )
- Replace Type Code with Class(以类取代型别码)
- Replace Type Code with Subclasses(以子类取代型别码)
- Replace Subclass with Fields(以值域取代子类)
- Replace Conditional with Polymorphism(以多态取代条件式)
- 10.8 replace parameter with methods(以函数取代参数)
- 重装VS6时,弹出Setup Was Unable to Create a DCOM User Account错误的解决方法
- python select實現非阻塞socket
- boc
- 【总结】IE和Firefox的Javascript兼容性总结
- launcher学习总结
- 11.11 replace inheritance with delegation(以委托取代继承)
- 生活20111019
- 一个不错的图片播放器,做前端的你懂的!!!
- FLASH中的Button组件的使用方法
- 微软相关网站无法打开解决办法
- js小记----- 判断日期的大小
- 关于nand flash的地址 A8寻址
- extern关键词详解
- WCF一些技巧