什么是多型呢?简单来说,是一个类别(或介面),设定了一些资料及函数(没有实做),而由其他类别所继承,并且在该类别实做。
举个例子来说,我们现在假设除了我们这个世界之外还许多平行宇宙,里面的人、事、物都跟我们这边一样,但是本身而言是不一样的。这些宇宙中的browser本身都是browser,有着browser的脸、browser的身体、browser的脑袋,我们可以说browser本身是一个介面。但是,继承这个介面的类别里将这些东西所实做的不一样,例如这个宇宙的browser的脑袋被实做成是喜爱Java的工程师,而在另一个宇宙则是被实做成喜爱C#.net的家伙,而在另一个宇宙,是被实做成大明星。
import java.lang.*;
public class example1 {
public static void main(String start[]){
browser tW = new thisWorld();
browser tW1 = new thatWorld1();
browser tW2 = new thatWorld2();
tW.mind();
tW1.mind();
tW2.mind();
System.exit(0);
}
}
interface browser {
public void mind();
}
class thisWorld implements browser {
public void mind() {
System.out.println("这个时空中(thisWorld),browser是個热爱Java的工程師");
}
}
class thatWorld1 implements browser {
public void mind() {
System.out.println("这个时空中(thatWorld1),browser是个拥护C#.net的邪恶工程師");
}
}
class thatWorld2 implements browser {
public void mind() {
System.out.println("这个时空中(thatWorld2),browser是个大明星");
多型有什么好处呢?例如:Java中的I/O APIs,里头的OutputStream便是一个典范,OutputStream的子类别都拥有OutputStream的函数,但是实做出来的却不同,像是FileOutputStream将write()函数设定为可以写入File的函数,而ZipOutputStream则是可以写入Zip压缩档案。也就是说,多型可以让处理同一类资料的类别拥有相同的函数,但是每个类别所实做出来的相同函数的功能不一定相同。
备注:根据Duncan先进的说明,其实IO APIs不止用到多型,还用到了Decorator pattern,详细细节请见底下Duncan先进的说明。
如果想要让你的子类别拥有相同的函数(包含相同的功能)的话,要使用类别继承,而不是继承介面。