//为什么要上转型
//Note.java
package c07;
public enum Note{middleC,cSharp,cFlat;}
//Music.java
package c07;
class Instrument {
public void play(Note n) {
System.out.println("Instrument.play()");
}
}
class Wind extends Instrument {
public void play(Note n) {
System.out.println("Wind.play() "+n);
}
}
class Wind2 extends Instrument {
public void play(Note n) {
System.out.println("Wind2.play() "+n);
}
}
public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.middleC);//关键是这里 i play
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute); // Upcasting
Wind2 flute2 = new Wind2();
tune(flute2); // Upcasting
}
} ///:~
//不用上转型,很麻烦
//: Music2.java
//Overloading instead of upcasting
class Note2 {
private int value;
private Note2(int val) { value = val; }
public static final Note2
middleC = new Note2(0),
cSharp = new Note2(1),
cFlat = new Note2(2);
} // Etc.
class Instrument2 {
public void play(Note2 n) {
System.out.println("Instrument2.play()");
}
}
class Wind2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Wind2.play()");
}
}
class Stringed2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Stringed2.play()");
}
}
class Brass2 extends Instrument2 {
public void play(Note2 n) {
System.out.println("Brass2.play()");
}
}
public class Music2 {
public static void tune(Wind2 i) {
i.play(Note2.middleC);
}
public static void tune(Stringed2 i) {
i.play(Note2.middleC);
}
public static void tune(Brass2 i) {
i.play(Note2.middleC);
}//相对于上转型是多余的
public static void main(String[] args) {
Wind2 flute = new Wind2();
Stringed2 violin = new Stringed2();
Brass2 frenchHorn = new Brass2();
tune(flute); // No upcasting
tune(violin);
tune(frenchHorn);
}
} ///:~