圣诞大减价开始了!

用委托代替继承

问题

你有一个子类,它只使用超类的一部分方法(或者不可能继承超类数据)。

解决方案

创建一个字段,并在其中放置一个超类对象,将方法委托给超类对象,并摆脱继承。

之前
将继承替换为前委托
将继承替换为委托-之后

为什么重构

在以下情况下,用组合取代继承可以极大地改进类设计:

  • 子类违反了利斯科夫替换原理例如,如果实现继承只是为了组合公共代码,而不是因为子类是超类的扩展。

  • 子类只使用父类的部分方法。在这种情况下,有人调用他或她不应该调用的超类方法只是时间问题。

本质上,这种重构技术分离了两个类,并使超类成为子类的助手,而不是父类。而不是继承所有的超类方法,子类将只有委托给超类对象的方法所必需的方法。

好处

  • 类不包含从超类继承的任何不需要的方法。

  • 可以将具有不同实现的各种对象放在delegate字段中。实际上你得到了策略设计模式。

缺点

  • 您必须编写许多简单的委托方法。

如何重构

  1. 在子类中创建一个用于保存父类的字段。在初始阶段,将当前对象放入其中。

  2. 更改子类方法,使它们使用超类对象而不是

  3. 对于在客户端代码中调用的从超类继承的方法,在子类中创建简单的委托方法。

  4. 从子类中删除继承声明。

  5. 通过创建一个新对象来更改存储前一个超类的字段的初始化代码。

Baidu
map