51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 5410|回复: 6
打印 上一主题 下一主题

[连载] 精通RFT-06: Java中的面向对象: 多态

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-4-22 18:46:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
讲完本节,便可进入到自动化测试及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 (强子))
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2010-5-4 21:54:45 | 只看该作者
谢谢你啊!无私的奉献!
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2010-5-9 23:37:57 | 只看该作者
太让人感动了。贰零零玖-贰拾一瞬间就让我如饮甘露




-------------------------------------------------------------------------------------------
2010应该怎么淘宝刷收藏
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2011-2-18 13:47:37 | 只看该作者
继续继续、谢谢谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2011-3-3 15:24:39 | 只看该作者
楼主对多态讲的非常好,例子形象简单,容易理解。希望我以后有机会也能用上RFT.
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2011-5-8 20:24:33 | 只看该作者
终于到面向对象的核心技术了,感觉的讲的很透彻!谢谢强子
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2011-5-26 18:16:03 | 只看该作者
nice try!
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-5-3 03:52 , Processed in 0.078798 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表