11.3.3 下移函数到子类
面向对象的类族体系中除了同一段代码存在多个子类的情况之外,还有一种常见的情况是父类含有了子类不需要的函数,使得子类强制性地获得了这个功能。无关的功能强加于子类,这也是一种耦合。这种情况恰好与上移函数的操作相反,我们需要将父类中并不是所有子类都含有的功能下移到下一个类型层次,因此,需要新建一个父类型,让公用这些功能操作的子类继承自这个新的父类。
例如上一节的Vehicle示例中,Vehicle中含有开门、关门的功能函数。但问题是并不是所有的交通工具都有车门,自行车也是交通工具,但是它们并没有车门,乘坐这类交通工具无时无刻都能够感受风的凉爽。因此,Vehicle类就使得自行车等无车门的子类含有了开门、关门的功能函数,这是不能接受的!尤其是当你的代码被他人引用时,不存在的功能函数却在类型中出现,这会让用户迷惑。因此,要处理掉这种情况。
首先要做的就是创建新的类型,使得这个类型作为含有这个功能的所有子类的基类,然后将那些功能函数下移到这个新的基类中,并且让需要这些功能的子类继承自新的基类。这么说起来有点抽象,我们结合Vehicle类族来修改。问题已经明朗了,就是打开、关闭车门的问题。因此,需要新建一个含有这两个功能的新的基类,新建的类为Car。代码如下:
public abstract class Car extends Vehicle {
public void openDoor() {
System.out.println("打开车窗吹吹风");
}
public void closeDoor() {
System.out.println("关闭车门");
}
}
也就是将Vehicle中的开门、关门函数移到了Car类中,同时Car也作为抽象类存在。然后让含有车门的类继承自Car类,让自行车等没有车门的类继承自Vehicle。Vehicle、Audi、Bike类型的代码如下:
// Vehicle没有了开门、关门操作 public abstract class Vehicle { public void start() { System.out.println("启动车子"); } public void stop() { System.out.println("停车"); } public void speedup() { System.out.println("加速"); } public void speedDown() { System.out.println("减速"); } public void turn() { System.out.println("转弯"); } } // 奥迪车有车门 public class Audi extends Car { public void startGPS() { System.out.println("使用GPS导航"); } } // 自行车没车门,继承自Vehicle public class Bike extends Vehicle { public void checkChains() { System.out.println("检查是否掉链子了"); } } |
通过函数下移、新建类型,将并不是所有子类公用的代码移到了合适的层次。这样一来就实现了分解,自行车不会含有开门、关门的操作,而Car类也让开门、关门的功能函数得到了复用,整个类型层次也更为清晰。
上移、下移函数能够处理函数的层级问题,相似的问题还有上移、下移字段,它们的操作都非常类似,无非是字段处在了不恰当的类型层级上,将字段搬移到新的层次中即可。
本文选自《Android开发进阶—从小工到专家》第十一章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
开发人员必备的技能之单元测试(4)—Android开发进阶