用委托代替继承
问题
你有一个子类,它只使用超类的一部分方法(或者不可能继承超类数据)。
解决方案
创建一个字段,并在其中放置一个超类对象,将方法委托给超类对象,并摆脱继承。
之前

后

为什么重构
在以下情况下,用组合取代继承可以极大地改进类设计:
子类违反了利斯科夫替换原理例如,如果实现继承只是为了组合公共代码,而不是因为子类是超类的扩展。
子类只使用父类的部分方法。在这种情况下,有人调用他或她不应该调用的超类方法只是时间问题。
本质上,这种重构技术分离了两个类,并使超类成为子类的助手,而不是父类。而不是继承所有的超类方法,子类将只有委托给超类对象的方法所必需的方法。
好处
类不包含从超类继承的任何不需要的方法。
可以将具有不同实现的各种对象放在delegate字段中。实际上你得到了策略设计模式。
缺点
- 您必须编写许多简单的委托方法。
如何重构
在子类中创建一个用于保存父类的字段。在初始阶段,将当前对象放入其中。
更改子类方法,使它们使用超类对象而不是
这
.对于在客户端代码中调用的从超类继承的方法,在子类中创建简单的委托方法。
从子类中删除继承声明。
通过创建一个新对象来更改存储前一个超类的字段的初始化代码。