第11章 处理概括关系

上传人:飞*** 文档编号:48523192 上传时间:2018-07-16 格式:PPT 页数:56 大小:1.89MB
返回 下载 相关 举报
第11章 处理概括关系_第1页
第1页 / 共56页
第11章 处理概括关系_第2页
第2页 / 共56页
第11章 处理概括关系_第3页
第3页 / 共56页
第11章 处理概括关系_第4页
第4页 / 共56页
第11章 处理概括关系_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《第11章 处理概括关系》由会员分享,可在线阅读,更多相关《第11章 处理概括关系(56页珍藏版)》请在金锄头文库上搜索。

1、第11章 处理概括关系11.1 值域上移 两个子类拥有相同的值域 将此值域移至父类可以去除重复的数据声明及重复的行为 针对待上移动的值域,检查它们的所有被使用点 ,确认以同样的方式被使用. 如果这此值域的名称不同,先将它们改名,使每 一个名称都和父类值域名称相同。 编译 测试 在父类中新建值域 移除子类的值域 编译 测试11.2 函数上移 函数在各个子类中产生完全相同的结果 将该函数移至父类 检查待提升函数,确定它们是完全一致。 如果待提升函数的签名式不同,修改为在父类中 使用的签名式。 在父类中新建一个函数,将某一个待提升函数的 代码复制到其中。做适当调整,然后编译。 移除该待提升的子类函数

2、。 编译,测试 逐一移除待提升的子类函数,直到只剩下父类的 函数为止。每次移除之后都需要测试、 观察该函数的调用者。看是否可以将它索求的对 象型别改为父类例:以customer表示顾客,它有两个子类:表示普通顾客 的RegularCustomer和表示贵宾的PreferredCutomer。两个类都有createBill()函数,且代码完全一样:void createBill(data Data)double chargeAmount = chargeFor(lastBillData,data);addBill(data,charge);由于各子类的chargeFor()函数不相同。须先在父类

3、中声 明chargeFor()抽象函数class Customer.abstract double chargeFor(data start , data end)然后将createBill()函数从其中一个子类中复制到父类中。11.3 构造函数本体上移 在各个子类中拥有一些构造函数,他们的本体几乎 完全一致 在父类中新建一构造函数,子类的构造函数调用它 。 在父类中定义构造函数。 将子类构造函数中的共同代码搬移到父类构造函 数中。 将子类构造函数中的共同代码删掉,调用新建的 父类构造函数。 编译,测试。下面是表示雇员的Employee类和表示经历的Manager类class Employee

4、.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,表 示子类应该调用它:然后从子类中调用它:class Employee.protected Employee(S

5、tring 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 (isPri

6、villiged() assignCar();boolean isPrivilliged() return _grade 4;不能把调用assignCar()的行为移到superclass构造函数中, 唯有把合适的值赋给_grade值域后才能执行assignCar()。class Employee.void initialize() if ( isPriviliged() ) assignCar();class Manager .public Manager(String name,String id,int grade)super(name,id);_grade = grade;initia

7、lize();11.4 函数下移 父类中的某个函数只与部分子类有关 将这个函数移到子类中 在所有子类中声明该函数,将父类的函数本体复 制到每一个 子类函数中。 删除父类中的函数。 编译,测试。 将该函数从所有不需要它的那些子类中删掉。 编译,测试。11.5 值域下移 父类中某个值域只被部分子类用到 将这个值域移到需要它的子类中 在所有子类中声明该值域。 将该值域从父类中移除。 编译,测试。 将该值域从所有不需要它的子类中删掉 编泽,测试。11.6 提炼子类 类中的某些特性只被部分实体用到 新建一个子类,将上述的部分特性移到子类中 为源类定义新的子类 为这个新的子类提供构造函数 找出调用父类构造

8、函数的所有地点,如果他们需 要的是新建的资料,令他们调用新构造函数。 逐一使用函数下移和值域下移,将源类的特性移 到子类中 找到所有这样的只有:他们传达的信息如今可由 继承体系自身传达。将值域进行自封装以避免被直 接使用,然后将它们的取值函数替换为多态常量函 数。 每次下移,编译并测试。JobItme类,用于决定当地修车厂的工作报价 class JobItem.public JobItem (int unitPrice, int quantity,boolean isLabor,Employee employee) _unitePrice = unitPrice;_quantity = qua

9、ntity;_isLabor = isLabor;_employee = employee;public int getTotalPrice() return getUnitPrice() * _quantity;public int getUnitPrice() return (_isLabor)? _employee.getRate():_unitPrice;public int getQuntity() return _quantity;public Employee getEmployee() return _employee;private int _unitePrice; priv

10、ate int _quantity; private boolean _isLabor; Private Employee _employee;需要提炼出类LaborItem。因为上述部分行为和数据只在labor 情况下才需要。首先建立这样一个类:class Employee.public Employee (int rate) _rate = rate;public int getRate() return _rate;private int _rate;class LaborItem extends JobItem为该类建立构造函数。将父类构造函数的参数列拷贝过来:然后要找到对JobIte

11、m构造函数的调用,并从中找出可替换为 JobItem构造函数者。因此下列语句:被替换为:public LaborItem(int unitPrice, int quantity,boolean isLabor,Employee employee) super (unitPrice, quantity, isLabor, employee ); JobItem j1 new JobItem (0,5,true,kent);JobItem j1 new LaborItem (0,5,true,kent);现在清理构造函数参数列。针对每个构造函数进行重命名。 首先处理父类构造函数。新建一个构造函数,

12、并把旧构造函 数声明为protected(不能直接声明为private, 因为子类还需要 它)class JobItem.protect JobItem (int unitPrice, int quantity,boolean isLabor,Employee employee) _unitePrice = unitPrice;_quantity = quantity;_isLabor = isLabor;_employee = employee;public JobItem(int unitPrice,int quantity) this(unitPrice,quantity,false,n

13、ull)外部调用使用新的构造函数编译、测试都通过后,再使用函数重命名方法修改子类构造函数:jobItem j2 = new JobItem(10,15);class LaborItem.public LaborItem(int unitPrice, int quantity) super(0,quantity,true,employee);现在,可以将JobItem的特性向下搬移。先从函数开始, 将getEmployee下移因为_employee值域也将在稍后被下移到LaborItem, 所以现在先将它声明为protected将_employee值域声明为protected之后,可以再次清 理

14、构造函数_isLabor值域所传达的信息,现在已经成为继承体系的内在信息, 因此可以移除这个值域。先将其进行自封装,再修改访问函数,改用多 态常量函数(在不同的子类实现版本中返回不同的固定值)。观察isLabor()函数的用户。对下列函数:重构为:当使用某项值域的函数全被下移至子类后,可以将值域 也下移。 由于_unitPrice值域只被LaborItem以外的对象所用 ,可以再次运用提炼子类的方法为JobItem提炼出一个子类: PartsItem。完成后,将JobItem声明为抽象类。11.7 提炼父类 两个类具有相似特性 为这两个类建立一个父类,将相同特性移至父类 为原本的类新建一个空白

15、的抽象父类 运用值域上移、函数上移、构造函数上移等方法逐一将各 子类的共同元素上移到父类。 先搬移值域,通常比较简单。 如果相应的子类函数有不l司的签名式,但用途相同,可以先 使用函数重命名将它们的签名式改为相同,然后上移 如果相应的子类函数有相同的签名式,但函数本体不同,可 以在父类把它们的共同签名式声明为抽象函数。 如果相应的子类函数有不同的函数本体,但用途相同,可试 着使 用算法替换,把其中一个函数的函数木体拷贝到另 一个函数 中。如果运转正常,就可以将其上移。 每次上移后,编译井测试。 检查留在子类中的函数,看它们是否还有共同成分。如果 它们只使用共同接口,就可以把它们所要求的对象型别

16、改为 父类以Employee表示员工, Department表示部门这里有两处共同点。首先,员工和部门 都有名称name;其次,他们都有年度 成本annul costs。要提炼出一个父类用以包容这些共同特性。第一步是新建父类,将现有 的两个类定义为其子类:将特性上移至父类,先移动值域将它的取值函数也上移至父类_name值域被声明为private之前,需要先将构造函数上移,这样才能对它赋值。Departement.getTotalAnnualCost和Employee.getAnnualCost两 个函数的用途相同,因此它们应该有相同的名称。运用函数重命名把 它们的名称改为相同:它们的函数本体仍然不同,因此目前还无法进行函数上移,但是可 以在父类中声明一个抽象函数:观察两个子类的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号