firstname = s.substring(i + 1).trim();
}
}
}
由此可见,Namer类的两个子类拥有它全部的属性和方法,并且在其之上更加入了解析姓名的能力,而代码却增加不多。代码重用,这是面向对象的主要魅力之一!
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类。