第十一章 处理概括关系 Dealing with Generalization
11.1 Pull Up Field(值域上移)
症状:两个subclasses拥有相同的值域
解决办法:将此一值移至superclass.
11.2 Pull Up Method(函数上移)
症状:有些函数,在各个subclass中产生完全相同的结果。
解决办法:将该函数移至superclass.
11.3 Pull Up Constructor Body(构造函数体上移)
症状:你在各个子类中拥有一些构造函数,它们的本体(代码)几乎完全一致。
解决办法:在superclass中新建一个构造函数,并在subclass构造函数中调用它。
11.4 Push Down Method(函数下移)
症状: superclass中的某个函数只与部分(而非全部)subclass有关。
解决办法:将这个函数移到相关的那些subclasses中去。
11.5 Push Down Field(值域下移)
症状:superclass中的某个值域与部分(而非全部)subclass有关。
解决办法:将这个值域移到相关的那些subclasses中去。
11.6 Extract Subclass(提炼子类)
症状:class中的某些特性(features)只被某些(而非全部)实体(instance)用到
解决办法:新建一个subclass,将上面所说的那一部分特性移到subclass中。
11.7 Extract Superclass(提炼超类)
症状:两个classes有相似特性(similar features)
解决办法:为这两个class建立一个superclass,将相同特性移至superclass.
11.8 Extract Interface(提炼接口)
症状:若干客户使用class接口中的同一子集;或者,两个classes的接口有部分相同。
解决办法:将相同子集提炼到一个独立接口中。
11.9 Collapse Hierarchy(折叠继承体系)
症状:superclass和subclass之间无太大区别
解决办法:将它们合为一体。
11.10 Form Template Method(塑造模板函数)
症状:你有一些subclass,其中相应的某些函数以相同顺序执行类似的操作,但各措施实际上有所不同。
解决办法:将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至superclass.
11.11 Replace Inheritance with Delegation(以委托取代继承)
症状:某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。
解决办法:在subclass中新建一个值域用以保持superclass,调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
11.12 Replace Delegation with Inheritance(以继承取代委托)
症状:你在两个class之间使用委托关系(delegation),并经常为整个接口编写许多极简单的请托函数(delegationg methods).
解决办法:让请托(delegating)class继承受托class(delegate)