package com.apple;
class Instrument3{
public void play(){
System.out.println("Instrument3.play()");
}
public String what(){
return "Instrument3";
}
public void adjust(){}
}
class Wind3 extends Instrument3{
public void play(){
System.out.println("Wind3.play()");
}
public String what(){return "Wind3";}
public void adjust(){}
}
class Percussion3 extends Instrument3{
public void play(){
System.out.println("Percussion3.play()");
}
public String what(){return "Percussion3";}
public void adjust(){}
}
class Stringed3 extends Instrument3{
public void play(){
System.out.println("Stringed3.play()");
}
public String what(){return "Stringed3";}
public void adjust(){}
}
class Brass3 extends Wind3{
public void play(){
System.out.println("Brass3.play()");
}
public void adjust(){System.out.println("Brassed.adjust()");}
}
class Woodwind3 extends Wind3{
public void play(){
System.out.println("Woodwind3.play()");
}
public void adjust(){System.out.println("Woodwind3.adjust()");}
}
public class Music3 {
static void tune(Instrument3 i){
i.play();
}
static void tuneALL(Instrument3[] e){
for (int i=0;i<e.length;i++)
tune(e[i]);
}
public static void main(String[] args){
Instrument3[] orchestra=new Instrument3[5];
int i=0;
orchestra[i++]=new Wind3();
orchestra[i++]=new Percussion3();
orchestra[i++]=new Stringed3();
orchestra[i++]=new Brass3();
orchestra[i++]=new Woodwind3();
tuneALL(orchestra);
}
}
新的方法是what()和adjust()。前者返回一个String句柄,同时返回对那个类的说明;后者使我们能对每种乐器进行调整。
在main()中,当我们将某样东西置入Instrument3数组的时候,就会自动上溯造型到Instrument3。
可以看到,在围绕tune()方法的其他所有代码都会发生变化的同时,tune()方法却丝毫不受他们的影响,依然正常工作。这正是利用多形性希望达到的目标。我们对代码进行修改后,不会对程序中不应该受到影响的部分造成影响。此外,我们认为多形性是一种至关重要的技术,它允许程序员“将发生改变的东西将没有发生改变的东西区分开来”。