好的,我有一个抽象的乐器课

public abstract class Instrument {
String name;

public Instrument(String name) {
    this.name = name;
}
public void warmUp() {
    System.out.println("Do re mi");
}
public abstract String Play(String notes);
}


我使用Sax和Trumpet类来扩展和实现抽象方法

public class Trumpet extends Instrument {

public Trumpet(String name) {
    super(name);
}
public String play(String notes) {
    String str;
    str = name + " plays Trumpet: " + notes;
    return str;
}

public String getNotes() {
    return notes;
}

public String toString(){
    String str = name + " plays Trumpet: " + notes ;
    return str;
}


萨克斯

public class Sax extends Instrument {

public Sax(String name) {
    super(name);
}
    public String play(String notes) {
    String str;
    str = name + " plays Trumpet: " + notes;
    return str;
}

public String getNotes() {
    return notes;
}

public String toString(){
    String str = name + " plays Sax: " + notes ;
    return str;
}


}
现在,我需要创建一个乐队类,创建一个由小号和萨克斯管组成的乐队。它允许用户添加乐器(萨克斯或小号)并弹奏输入音符。当乐队演奏时,这意味着所有乐器都应演奏输入音符。

public class Band extends Instrument{
ArrayList<Instrument> myBand = new ArrayList<Instrument>();

public Band(String name) {
    super(name);
}

public void addInstrument(Instrument a) {
    myBand.add(a);
}

public String play(String notes) {
    for(Instrument inst : myBand) {
        inst.play(notes);
        System.out.println(inst.play(notes));
    }
    return toString();

}


它不一定必须在arrayList中,我只是认为这会使事情更容易处理。我相信到目前为止一切都很顺畅,但是我的问题出在乐队的演奏方法上,它应该显示乐器名称,所有乐器都演奏相同的音符。

样本驱动程序:

myBand.addInstrument (new Sax("Anna"));
myBand.addInstrument (new Trumpet("Leon"));
myBand.addInstrument (new Sax("Ben"));

myBand.play("Dum da-da DUM");


输出:
安娜(Sanna)演奏萨克斯:Dum da-da DUM
莱昂(Leon)吹小号:Dum da-da DUM
本萨克斯演奏:Dum da-da DUM

我知道我需要一个循环来遍历数组列表,但不确定如何从sax和trumpet类中获取play方法,它们都演奏相同的音符。

感谢您提供的所有帮助!

我用循环更新了代码,但这是我得到的输出:

Anna plays Trumpet: Dum da-da DUM
Leon plays Trumpet: Dum da-da DUM
Ben plays Trumpet: Dum da-da DUM

最佳答案

您的Instrument类声明一个带有abstract参数的名为PlayString方法。这样,所有从Instrument扩展的类都必须实现该方法或自己声明为abstract

因为类型Instrument已经声明了这样的方法,所以您可以在该类型的任何引用上调用它。

Instrument instrument = new ...// some class that extends from Instrument
instrument.Play("some note")


通过多态和late-binding可以解决对Play()的调用。它将在实现类中使用重写的方法。



Java命名约定规定方法应以小写字母字符开头,并使用camelCase

08-08 00:37