复习JAVA编程思想第4版第14章类型信息的练习26时,clearSpitValve方法实现,最开始想直接搜答案,暂时没找到合适的,自己补充完成实现如下,欢迎拍砖:
法1:RTTI式
public enum Note {
MIDDLE_C, C_SHARP, B_FLAT; // Etc.
}
public class Instrument {
public void play(Note n) {
System.out.println("Instrument.play()");
}
}
class Stringed extends Instrument {
public void play(Note n) {
System.out.println("Stringed.play() " + n);
}
}
class Percussion extends Instrument {
public void play(Note n) {
System.out.println("Percussion.play() " + n);
}
}
class Electronic extends Instrument {
public void play(Note n) {
System.out.println("Electronic.play() " + n);
}
}
class Wind extends Instrument {
public void play(Note n) {
clearSpitValve();
System.out.println("Wind.play() " + n);
}
public void clearSpitValve() {
System.out.println("清理口水先!");
}
}
public class Music {
public static void tune(Instrument i) {
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Instrument flute = new Wind();
tune(flute); // Upcasting
}
}
法2:将prepareInstrument置于基类中
public class Instrument {
public void prepareInstrument(){
}
public void play(Note n) {
System.out.println("Instrument.play()");
}
}
class Stringed extends Instrument {
public void play(Note n) {
System.out.println("Stringed.play() " + n);
}
}
class Percussion extends Instrument {
public void play(Note n) {
System.out.println("Percussion.play() " + n);
}
}
class Electronic extends Instrument {
public void play(Note n) {
System.out.println("Electronic.play() " + n);
}
}
class Wind extends Instrument {
public void prepareInstrument(){
System.out.println("清理口水先!");
}
public void play(Note n) {
prepareInstrument();
System.out.println("Wind.play() " + n);
}
}
总结,整体上,法2是更通用一些,类似乐器的初始化要根据不同的乐器不同设置。