类中的某些特性只被某些实例用到。
新建一个子类,将上面所说到的那一部分特性移到子类中。
动机:
发现类中的某些行为只被一部分实例用到,其他实例不需要它们。有时候这种行为上的差异是通过类型码区分的,此时可以使用replace type code with subclasses或replace type code with state/strategy。
extract subclass一旦对象创建完成,无法再更改与类型相关的行为。extract class,只需插入另一个组件就可以改变对象的行为。此外子类只能用以表现一组变化。如果你希望一个类以几种不同的方式变化,就必须使用委托。
做法:
为源类定义一个新的子类
为这个新的子类提供构造函数
=》简单办法:让子类构造函数接受与超类构造函数相同的参数,并通过super调用超类构造函数。
=》如果你希望对用户隐藏子类的存在,可使用replace constructor with factory method。
找出调用超类构造函数的所有地点。如果它们需要的是新建的子类,令它们改而调用新构造函数。
=》如果子类构造函数需要的参数和超类构造函数的参数不同,可以使用rename method修改其参数列。如果子类构造函数不需要超类构造函数的某些参数,可以使用rename method将他们去除。
逐一使用push down method和push down field将源类的特性移到子类去。
=》和extract class不同的是,先处理函数再处理数据,通常会简单一些。
=》当一个public函数被下移到子类后,你可能需要重新定义该函数的调用端的局部变量或参数类型,让它们改而调用子类中的新函数。如果忘记进行这一步骤,编译器会提醒你。
找到所有这样的字段:它们所传达的信息如今可由继承体系自身传达,以selfexcapsulate field避免直接使用这些字段,然后将它们的取值函数替换为多态常量函数。所有使用这些字段的地方都应该以replace conditional with polymorphism重构。
=》任何函数如果位于源类之外,而又使用了上述字段的访问函数,考虑以move method将它移到源类中,然后再使用replace conditional with polymorphism。