0

好的,伙计们,我有一个抽象的仪器类

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");

输出:
Anna 吹萨克斯 : Dum da-da DUM
Leon 吹小号 : Dum da-da DUM
Ben 吹萨克斯 : 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 
4

3 回答 3

1

您的Instrument类声明了一个使用参数abstract调用的方法。通过这样做,所有扩展自的类都必须实现该方法或声明为它们自己。PlayStringInstrumentabstract

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

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

调用Play()将通过多态性和后期绑定来解决。它将使用实现类中的覆盖方法。


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

于 2013-09-17T16:14:48.363 回答
0

I know that I need a loop to loop through the array list but not sure how to get the play method from the sax and trumpet class and them all play the same note.

The beauty of inheritance - you don't need to get the play method from the trumpet or sax classes, you just call the play method on each Instrument:

public String Play(String notes) {
    for(Instrument inst : myBand)
    {
        inst.play(notes);
    }
}

Try it!

于 2013-09-17T16:12:30.920 回答
0

您可以简单地遍历 arraylist 并调用基本(抽象)play()方法。

虚拟和抽象方法的全部意义在于它将调用派生实现。

于 2013-09-17T16:10:23.153 回答