正在阅读:Java咖啡馆(8)——大话面向对象(下)Java咖啡馆(8)——大话面向对象(下)

2005-03-25 12:08 出处: 作者:Gary Chan 责任编辑:xietaoming

  3.多态

  至此,我们已经分别为两种名字解析方法编写了两个类,即FirstLast类和FirstFirst类。为了更好地使用这两个类,让我们玩一些小技巧。

  首先,对于姓名解析器的使用者,具体是使用Namer类还是FirstLast类还是FirstFirst类,他是不关心的。这些东西最好都是自动化的,他只要能得到姓和名即可。
其次,如果你是属于胆大心细遇事不慌的(阿庆嫂类型)IT青年的话,一定会发现Namer.java中只有Namer类是public的,FirstFirst类和FirstLast类之前没有修饰——它们是默认的package的,也就是说,在com.cfan.garychan.nameparser包之外,都是无法被访问到的。

  如果仅仅能够Namer类来解析姓名那该多好啊!

  实际上,运用多态的概念,这些问题将迎刃而解。

  面向对象一共有三个特性:封装、继承、多态。所谓封装,就是通过定义类并且给类的属性和方法加上访问控制来抽象事物的本质特性。所谓继承,就是代码重用。而多态,从另外一个角度分割了接口和实现,即把“什么”和“如何”两个概念分离开来。举个例子,公路赛车是自行车,继承了自行车的刹车方法。假设你和朋友骑着捷安特的公路赛车出游,当你的朋友正好侧着脸看风景时,前面突然窜出来一只猫,你一定大声惊呼:赶快刹车!仔细体会这句话,你的意识中只是知道自行车可以刹车,所以让朋友按下车闸让自行车刹车,而绝对不是认为—捷安特牌子的公路赛车赶快刹车!从而,思考的是抽象的
自行车的刹车,而最终动作却是捷安特牌子的公路赛车刹车,通过类指代实例,这就是多态的概念。

  回过头看我们的程序,public的Namer类正好是FirstFirst类和FirstLast类的共同父类,应用多态的概念实在是太合适不过了。新建一个名为NameFactory的类,并且把这个类也放在com.cfan.garychan.nameparser包中,代码如下:

public class NameFactory {
    public static Namer getNamer(String entry) {
    if (entry.indexOf(",") > 0)
        return new FirstLast(entry); //return one class
    else if (entry.indexOf(" ") > 0)
        return new FirstFirst(entry); //or the other
    else
        return null;
    }
}

  NameFactory类只有一个静态方法getNamer,注意返回的是一个Namer类。下面根据entry参数是否包含“,”符号来确定实际生成的是FirstLast类还是FirstFirst类,最终将其返回。你看,说是返回Namer类,实际返回的是FirstLast类或者FirstFirst类,这就是多态的典型应用。需要注意的是,并非毫不相关的类都能够当作多态使用,必须是有继承关系,而且有方向性。结合生活经验,多态的概念并不难理解。

  最后让我们看看如何使用这个姓名解析器。新建Chap07NameParser类,Package是com.cfan.garychan,代码如下:

package com.cfan.garychan;

import com.cfan.garychan.nameparser.NameFactory;
import com.cfan.garychan.nameparser.Namer;

/**
* 用解析器解析姚明的英文名字。
*/
public class Chap07NameParser {
    public static void main(String[] args) {
        Namer namer = NameFactory.getNamer("Yao, Ming");
        if (null == namer) {
            System.out.println("姓名不合法");
        else {
            System.out.println("姓:" + namer.getSurname());
            System.out.println("名:" + namer.getFirstname());
        }
    }
}

  你看,我们通过NameFactory返回一个Namer对象,这个对象能够解析姚明的英文名字,你不必关心这个Namer对象究竟是FirstFirst类还是FirstLast类,方便极了。

面向对象的未来

  面向对象技术是软件技术自然演变的结果,在许多领域有着强大的生命力与美好的前景。借用Maurice Wilkes在他的图灵奖领奖仪式上的话,“面向对象技术是70年代以来最激动人心的革新之一”。然而,面向对象并非包治百病的灵丹妙药,其发展还远未成熟,还有许多问题值得我们付出真正的热情!

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品