Replace Inheritance with Delegation(以继承取代委托)
2017-06-22 09:18
357 查看
你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数。
让委托类继承受托类
两条告诫:①.如果你并没有使用受托类的所有函数,那么就不应该使用Replace Inheritance with Delegation(以继承取代委托),因为子类应该总是遵循超类的接口。如果过多的委托函数让你烦心,你有别的选择:你可以通过Remove Middle Man(移除中间人)让客户端自己调用受托函数,也可以使用Extract Superclass(提炼类)将两个类接口相同的部分提炼到超类中,然后让两个类都继承这个新的超类;你还可以用类似的手法使用Extract Interface(提炼接口)
另一种需要当心的情况是:受托对象被不止一个其他对象共享,而且受托对象是可变的。在这种情况下,你就不能将委托关系替换为继承关系,因为这样就无法再共享数据了。数据共享是必须由委托关系承担的一种责任,你无法把它转给继承关系。如果受托对象是不可变,数据共享就不成问题,因为你大可以放心赋值对象。
编译。
1)此时,某些函数可能会发生冲突:他们可能有相同的名称,但在返回类型、异常指定或可见承担方面有所差异。
将受托字段设为该字段所处对象本身。
去掉简单的委托函数。
编译并测试。
将所有其他设计委托关系的代码,改为调用对象自身。
移除受托字段。
让委托类继承受托类
1. 动机
本重构与Replace Inheritance with Delegation(以委托取代继承)恰恰相反。如果你发现自己需要使用受托类的所有函数,并且费了很大力气编写所有极简的委托函数,本重构可以帮助你轻松回头使用继承。两条告诫:①.如果你并没有使用受托类的所有函数,那么就不应该使用Replace Inheritance with Delegation(以继承取代委托),因为子类应该总是遵循超类的接口。如果过多的委托函数让你烦心,你有别的选择:你可以通过Remove Middle Man(移除中间人)让客户端自己调用受托函数,也可以使用Extract Superclass(提炼类)将两个类接口相同的部分提炼到超类中,然后让两个类都继承这个新的超类;你还可以用类似的手法使用Extract Interface(提炼接口)
另一种需要当心的情况是:受托对象被不止一个其他对象共享,而且受托对象是可变的。在这种情况下,你就不能将委托关系替换为继承关系,因为这样就无法再共享数据了。数据共享是必须由委托关系承担的一种责任,你无法把它转给继承关系。如果受托对象是不可变,数据共享就不成问题,因为你大可以放心赋值对象。
2.做法
让委托端称为受托段的一个子类。编译。
1)此时,某些函数可能会发生冲突:他们可能有相同的名称,但在返回类型、异常指定或可见承担方面有所差异。
将受托字段设为该字段所处对象本身。
去掉简单的委托函数。
编译并测试。
将所有其他设计委托关系的代码,改为调用对象自身。
移除受托字段。
相关文章推荐
- 处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)
- 处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)
- Replace Delegation with Inheritance (以继承取代委托)
- Replace Inheritance with Delegation (以委托取代继承)
- 重构手法67:Replace Inheritance with Delegation (以委托取代继承)
- 重构手法68:Replace Delegation with Inheritance (以继承取代委托)
- 11.11 replace inheritance with delegation(以委托取代继承)
- Replace Delegation with Inheritance(以委托取代继承)
- 重构第8天:使用委托代替继承(Replace Inheritance with Delegation)
- c++面向对象之复合(composition)、委托(delegation)、继承(inheritance)--(boolan)
- 设计模式:Inheritance(继承) 和 Delegation(委托)
- 重构手法49:Replace Parameter with Methods (以函数取代参数)
- Replace Data Value with Object (以对象取代数据值)
- 8.15 replace type code with state/strategy (以state/strategy取代类型码)
- 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)
- 重构之以委托取代继承
- Replace Type Code with Subclasses (以子类取代类型码)
- Replace Conditional with Polymorphism (以多态取代条件表达式)
- 8.5 replace array with object (以对象取代数组)
- 重构手法30:Replace Type Code with Class (以类取代类型码)