Animal类是Cat和Horse和父类,Animal中包含了两个值域和一个方法。可以将Animal中的值域有选择地下移到某个子类中。此外,还可以为Animal提炼超类和接口。 1、搬迁方法 打开Animal.java并将光标定位到howl()方法处,通过Ctrl+Shift+R->Push Down Method调出下移方法对话框:
图 16 下移方法
・Method:下移的方法。 ・Keep as abstract in current class:表示在下移方法的同时将类转为抽象类。 ・Selected subclasses:列出当前类的所有子类,默认情况下方法将下移到所有子类中,我们取消Cat,仅将howl()下移到Horse中。
文章版权归原作者所有! (www.MegaEntry.com)
方法howl()中引用到Animal类的一个私有变量private int volume,在下移howl()后,该变量变为protected int volume。 上推和下移是相反的操作,负责将子类中的方法推到父类中去。保存并重新编译工程,打开Horse.java将光标置到howl()方法处:Ctrl+Shift+R->Pull Up Method调出上推的对话框:
图 17
上推方法 如果需上推的方法引用到了类中的其他方法,这些被引用的方法列在Select dependent members to moves列表中,一般情况下你需要将这些被引用的方法一起上移到父类中。 面向对象的一个重要特性即是子类共享父类的代码,所以当你发现子类的方法或值域是共享性的代码时,你就需要着手将这些代码推到父类中去了,这样代码的复用性将得到提升。 2、搬迁值域 Animal类中有两个值域:
MegaEntry 网络社区与信息交流平台!
1. protected int weight ;2. protected int volume = weight ;
我们希望将volume下移到子类Cat中,光标定位到volume处:Ctrl+Shift+R>Push Down Field调出下移值域的对话框:
图 18 下移值域
・Field:需下移的值域。 ・Select subclasses:当前类的子类。在默认情况下,值域下移到所有的子类中,可以通过子类前的复选框作出选择,这里我们去除Horse类前的勾选,即仅下移到Cat中。 ・Select dependent members to move:和下移值域相关的所有值域,JBuilder通过下移值域右边的赋值语句找出所有关联的值域,通过关联值域前的复选框决定是否需要一起下移到子类。默认情况下,JBuilder将关联的属性weight随volume一起下移。 按OK后完成下移。编译工程,打开Horse.java,我们执行下移值域的反操作:上推值域到Animal类中。 光标定位在Horse.java的volume值域处:Ctrl+Shift+R->Pull Up Field调出上推值域对话框,如下图所示:
1. package myrefactor ;2. 3. public class Creature4. {5. public Creature()6. {7. }8. }
Animal代码做如下调整
文章版权归原作者所有! (www.MegaEntry.com)
代码清单 8 提炼超类
1. package myrefactor ;2. 3. public class Animal extends Creature4. {5. …6. }
由于Creature生成后并未编译,所以Animal类在编辑器中会提示语法错误, 出现在控制槽上。你可以通过重构信息窗口的 按钮编译重构相关的类以消除这个语法错误。本文后续内容还会碰到相似的情况,解决方法相同,将不再赘述。 4、提炼接口 假设我们需要为动物定义一些共同的习性,可以将类的若干方法提炼出来,用一个接口来表达。打开Animal.java,将光标移到类名Animal处:Ctrl+Shift+R->Extract Interface from Class “Animal”调出提炼接口对话框,如下所示: