字段上移
如果两个子类拥有相同的字段,请通过 Pull Up Field(字段上移) 将该字段移至超类。
1 2 3 4 5 6 7 8 9
| class Employee {...}
class Salesman extends Employee { private String name; }
class Engineer extends Employee { private String name; }
|
1 2 3 4 5 6
| class Employee { protected String name; }
class Salesman extends Employee {...} class Engineer extends Employee {...}
|
重构原因
子类分别的进行开发,会导致出现相同(或几乎相同)的字段和方法。
好处
- 消除子类中重复的字段;
- 可以使你将使用该字段的行为从子类移至超类,从而去除重复的行为。
函数上移
如果有些函数在各个子类中产生完全相同的效果,请通过 Pull Up Method(函数上移) 将该函数移至超类。
1 2 3 4 5 6 7 8 9
| class Employee {...}
class Salesman extends Employee { get name() {...} }
class Engineer extends Employee { get name() {...} }
|
1 2 3 4 5 6
| class Employee { get name() {...} }
class Salesman extends Employee {...} class Engineer extends Employee {...}
|
重构原因
子类彼此独立地进行开发,会导致相同(或几乎相同)的字段和方法。
好处
- 摆脱重复的代码。如果需要对方法进行修改,最好在一个地方进行更改,而不是在子类中重复修改;
- 如果由于某种原因,子类重新定义了超类方法但执行基本相同的工作,也可以使用这种重构技术。
构造函数本地上移
如果在各个子类拥有一些几乎完全一致的构造函数,可以通过 Pull Up Constructor Body(构造函数本体上移) 早超类中新建一个构造函数,并在子类中调用它。
1 2 3 4 5 6 7 8
| class Manager extends Employee { public Manager(String name, String id, int grade) { this.name = name; this.id = id; this.grade = grade; } }
|
1 2 3 4 5 6 7
| class Manager extends Employee { public Manager(String name, String id, int grade) { super(name, id); this.grade = grade; } }
|
函数下移
如果超类中的某个函数只与部分子类有关,请通过 Push Down Method(函数下移) 将这个函数移到相关的那些子类去。
1 2 3 4 5 6
| class Employee { getQuota {...} }
class Engineer extends Employee {...} class Salesman extends Employee {...}
|
1 2 3 4 5
| class Employee {...} class Engineer extends Employee {...} class Salesman extends Employee { getQuota {...} }
|
好处
字段下移
如果超类中某个字段只被部分子类用到,那么请通过 Push Down Field(字段下移) 将这个字段移到需要它的那些子类去。
1 2 3 4 5 6
| class Employee { private String quota; }
class Engineer extends Employee {...} class Salesman extends Employee {...}
|
1 2 3 4 5 6
| class Employee {...} class Engineer extends Employee {...}
class Salesman extends Employee { protected String quota; }
|
好处
- 提高类的内聚性,让字段位于实际使用的位置;
- 同时移动到多个子类时,可以相互独立地开发字段。这确实会创建代码重复,因此只有在您真正打算以不同方式使用字段时才按下字段。
提炼子类
提炼超类
提炼接口
折叠继承体系
塑造模板函数
以委托取代继承
以继承取代委托