两个subclasses 拥有相同的值域。将此一值域移至superclass。
有些函数,在各个subclass 中产生完全相同的结果。将该函数移至superclass。
你在各个subclass 中拥有一些构造函数,它们的本体(代码)几乎完全一致。
在superclass 中新建一个构造函数,并在subclass 构造函数中调用它。
superclass 中的某个函数只与部分(而非全部)subclasses 有关。
将这个函数移到相关
superclass 中的某个值域只被部分(而非全部)subclasses 用到。
将这个值域移到需要它的那些subclasses 去。
class 中的某些特性(features)只被某些(而非全部)实体(instances)用到。
新建一个subclass ,将上面所说的那一部分特性移到subclass 中。
两个classes 有相似特性(similar features)。
为这两个classes 建立一个superclass ,将相同特性移至superclass 。
若干客户使用class 接口中的同一子集;或者,两个classes 的接口有部分相同。
将相同的子集提炼到一个独立接口中。
superclass 和subclass 之间无太大区别。
将它们合为一体。
你有一些subclasses ,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。
将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至superclass 。
某个subclass 只使用superclass 接口中的一部分,或是根本不需要继承而来的数据。
在subclass 中新建一个值域用以保存superclass ;调整subclass 函数,令它改而委托superclass ;然后去掉两者之间的继承关系。
如果你发现自己需要使用「受托 class」中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),本重构可以帮助你轻松回头使用「继承」。
有一批重构手法专门用来处理「概括关系」(generalization ;译注:这里指的是class 继承」这档事),其中主要是将函数(methods)上下移动于继承体系之中。 Pull Up Field 和 Pull Up Method 都用于将class 特性向继承体系的上端移动,Push Down Method 和 Push Down Field 则将class 特性向继承体系的下端移动。构造函数比较难以向上拉动,因此专门有一个Pull Up Constructor Body 处理它。我们不会将构造函数往下推,因为 Replace Constructor with Factory Method 通常更管用。
如果有若干函数大体上相同,只在细节上有所差异,可以使用Form Template Method 将它们的共同点和不同点分开。
除了在继承体系中移动class 特性之外,你还可以建立新class ,改变整个继承体系。 Extract Subclass、Extract Superclass 和 Extract Interface 都是这样的重构手法,它们在继承体系的不同位置构造出新元素。如果你想在型别系统(type system)中标示(mark)一小部分函数, Extract Interface 特别有用。如果你发现继承体系中的某些classes 没有存在必要,可以使用 Collapse Hierarchy 将它们移除。
有时候你会发现继承并非最佳选择,你真正需要的其实是委托(delegation),那么, Replace Inheritance with Delegation 可以帮助你把继承改为委托。有时候你又会想要做反向修改,此时就可使用Replace Delegation with Inheritance。
1、实事求是的继承:
1.1、按需把函数或成员变量放在子类或父类。
1.2、按需添加或合并子类。
2、高级应用
2.1、模板模式
2.2、委托模式
2.2、选择使用模板模式还是采用委托模式。条件是使用次数多少,多的用模板,少的用委托。
【重构.改善既有代码的设计】11、处理概括关系【更优雅的继承】
原文:https://www.cnblogs.com/aoyihuashao/p/10387399.html