处理概括关系之三 :Pull Up Constructor Body(构造函数本体上移)
来源:互联网 发布:闪电抢购软件使用方法 编辑:程序博客网 时间:2024/05/01 07:31
你在各个subclass 中拥有一些构造函数,它们的本体(代码)几乎完全一致。
在superclass 中新建一个构造函数,并在subclass 构造函数中调用它。
class Manager extends Employee...
public Manager (String name, String id, int grade) {
_name = name;
_id = id;
_grade = grade;
}
public Manager (String name, String id, int grade) {
super (name, id);
_grade = grade;
}
动机(Motivation)
构造函数(constructors )是很奇妙的东西。它们不是普通函数,使用它们比使用普通函数受到更多的限制。
如果你看见各个subclass 中的函数有共同行为,你的第一个念头应该是将共同行为提炼到一个独立函数中,然后将这个函数提升到superclass 。对构造函数而言,它们彼此的共同行为往往就是「对象的建构」。这时候你需要在superclass 中提供一个构造函数,然后让subclass 都来调用它。很多时候,「调用superclass 构造函数」就是subclass 构造函数的惟一动作。这里不能运用Pull Up Method,因为你无法在subclass 中继承superclass 构造函数(你可曾痛恨过这个规定?)。
如果重构过程过于复杂,你可以考虑转而使用Replace Constructor with Factory Method。
作法(Mechanics)
范例:(Example)
下面是一个表示「雇员」的Employee class 禾11 一个表示「经理」的Manager class:
class Employee...
protected String _name;
protected String _id;
class Manager extends Employee...
public Manager (String name, String id, int grade) {
_name = name;
_id = id;
_grade = grade;
}
private int _grade;
Employee 的值域应该在Employee 构造函数中被设妥初值。因此我定义了一个Employee 构造函数,并将它声明为protected,表示subclass 应该调用它:
class Employee
protected Employee (String name, String id) {
_name = name;
_id = id;
}
然后,我从中调用它:
public Manager (String name, String id, int grade) {
super (name, id);
_grade = grade;
}
后来情况又有些变化,构造函数中出现了共同代码。假如我有以下代码:
class Employee...
boolean isPriviliged() {..}
void assignCar() {..}
class Manager...
public Manager (String name, String id, int grade) {
super (name, id);
_grade = grade;
if (isPriviliged()) assignCar(); //every subclass does this
}
boolean isPriviliged() {
return _grade > 4;
}
我不能把调用assignCar() 的行为移到superclass 构造函数中,因为惟有把合适的值赋给_grade 值域后才能执行assignCar() 。此时我需要Extract Method 和 Pull Up Method。
class Employee...
void initialize() {
if (isPriviliged()) assignCar();
}
class Manager...
public Manager (String name, String id, int grade) {
super (name, id);
_grade = grade;
initialize();
}
- 处理概括关系之三 :Pull Up Constructor Body(构造函数本体上移)
- 处理概括关系之二 :Pull Up Method(函数上移)
- 处理概括关系之一 :Pull Up Field(值域上移)
- 11.2pull up method(函数上移)
- 《重构改善既有代码的设计》之重构列表--处理概括关系(三)
- 重构方法之处理概括关系(继承关系)
- JavaScript原型和闭包之---构造函数、原型与对象三者之间的关系(扩充constructor)(五)
- 处理概括关系之四 :Push Down Method(函数下移)
- 处理概括关系之十 :Form Template Method(塑造模板函数)
- 构造函数(constructor)
- 处理概括关系(一)
- 处理概括关系(二)
- 处理概括关系之六 :Extract Subclass(提炼子类)
- 处理概括关系之八 :Extract Interface(提炼接口)
- 重构之处理概括关系
- 深入探索C++对象模型笔记之三 —— 构造函数语意学 (Default Constructor的建构操作)
- 6、处理概括关系
- 处理概括关系
- 构建现代站点且同时支持旧版IE的20个提示
- C程序设计课程-第七次实验报告
- 除了当科学家,你还能干什么?-给理工科同学几本书
- 可编辑的TD
- π你能记住几个?
- 处理概括关系之三 :Pull Up Constructor Body(构造函数本体上移)
- 百度笔试题:malloc/free与new/delete的区别
- android中如何提高service的优先级
- Java Socket通讯例子
- 开发者需知的10类工具
- 使用标尺工具获取某点的坐标
- ‘福布斯‘称2013年踏入智能系统年
- window 2008 安装 oracle 10g
- Windows 7 Ubuntu双系统安装历险记