|
讲完本节,便可进入到自动化测试及RFT的应用上了(其它关于JAVA的知识点用到了再说),如果再把JAVA讲下去,估计会被人认为我在打着RFT的幌子讲JAVA,虽然于情于理这对我来说都没有任何好处,但是谁相信呢?网络上没有诚信可言,别人只会看到在这里讲JAVA,在讲面向对象,虽然我一再强调要学好RFT,这是必备的基础知识,但是谁听呢?谨以此文,献给那些真正理解自动化测试的朋友们,世上没有速成一说。
何为多态?四个字:多种形态。“多形性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与“怎样做”两个模块的分离。利用多态性能创建“易于扩展”的程序,无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成长”。
举个现实中的例子,“我”,有N多种角色(形态),在老婆面前,我是“老公”,在老爸面前,我是“儿子”,在儿子面前,我是“老爸”,在学生面前,我是“老师”…..,“我”具有多种形态,对于“我”的不同的形态,我将会说不同的话,做不同的事。
现在定义一个接口,IQiang,定义两个方法talk()和work(),说话和做事,我们知道,“我”在不同的形态(角色)下肯定会做不同的事情,说不同的话,比如:
1) 如果我是“老公”,我会对老婆说“我爱你”,我会履行老公做的事情,比如“拖地”。
2) 如果我是“儿子”,我会对老爸说“别抽烟了”,我会履行儿子做的事情,比如“回家看看”。
3) 如果我是“老爸”,我会对儿子说“好好学习”,我会履行老爸做的事情,比如“送儿子上学”。
4) 如果我是“老师”,我会对学生说“多态是什么”,我会履行老师做的事情,比如“备课”。
这些角色和对应的说的话做的事都不一样,但是它们都可以实现接口IQiang中定义的方法talk()和work()。
“我”可以有很多角色,为讲解简单,我们取“老公”和“老师”这两个角色来进行代码演示即可。
首先定义接口及方法:
package com.agilejoy.rft;
public interface IQiang {
public void talk();
public void work();
}
接着定义“老公”类实现该接口:
package com.agilejoy.rft;
public class Husband implements IQiang {
public void talk() {
System.out.println("I love you, honey ...");
}
public void work() {
System.out.println("It is time to clean ...");
}
}
然后定义“老师”类实现该接口:
package com.agilejoy.rft;
public class Teacher implements IQiang {
public void talk() {
System.out.println("What's Polymorphism ...");
}
public void work() {
System.out.println("Prepare the RFT material ...");
}
}
到目前为止,与上一节讲的接口一样,没有什么特别之处,多态的重点表现在如下这段代码中:
package com.agilejoy.rft;
public class Qiang {
public static void main(String[] args) {
IQiang qiang;
if (args[0].equals("Husband"))
qiang = new Husband();
else
qiang = new Teacher();
qiang.talk();
qiang.work();
}
}
运行Qiang这个类,首先定义了接口类型qiang,qiang可以用Husband实例化,也可以用Teacher实例化,并且具体用哪个实例化完全可以由我运行时输入的参数来决定。这就是多态,本次运行你要我做“老公“的角色,那么我就实例化成“Husband”类,否则,我就实例化成“Teacher”的类。代码这里用到了if … else …,这显得还是比较死板,如果形态太多,分支会很大,而且不易于维护,所以如下代码才是多态性实现的标准代码:
package com.agilejoy.rft;
public class Qiang {
public static void main(String[] args) throws Exception {
Class qiangc = Class.forName(args[0]);
Object qiango = qiangc.newInstance();
IQiang qiang = (IQiang)qiango;
qiang.talk();
qiang.work();
}
}
此处是通过命令行参数传递的方式来实现不同的实例化,args[0]无非就是一个字符串,这个来源可以任意。这就是多态的应用,假如我们还要对IQiang扩展“老爸”的角色,只需要现新增类就行了,Qiang这个类不用做任何改动,提高代码的维护性和重用性,因为强这个代码当中没有一行代码是跟“Husband”,“Teacher”这种特定类相关的,实现了代码的高度抽象。
注:如果你的Qiang这个类在包中,参数需要给定完整的包名,如com.agilejoy.rft.Husband,如果不在包中,参数直接使用“Husband”即可,关于JAVA中“包”的用法,请朋友们自行阅读相关材料。
(声明:本文版权归作者个人所有,如需转载,请注明出处,如有需要,请联系QQ: 15903523 (强子)) |
|