抽象类ArrayList toString

时间:2013-09-17 16:08:01

标签: java abstract-class tostring extends

好的我有一个抽象的乐器类

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;
}

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

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中,我只是认为它会使事情更容易处理。我相信到目前为止我的一切都很顺利,但我的问题出现在乐队的Play方法中,它应该显示乐器的名称,所有乐器都会播放相同的音符。

示例驱动程序:

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

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

输出:
安娜扮演萨克斯:Dum da-da DUM
莱昂演奏小号:Dum da-da DUM
Ben扮演Sax: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 

3 个答案:

答案 0 :(得分:1)

您的Instrument类声明了一个名为abstract的{​​{1}}方法,其Play参数。通过这样做,从String扩展的所有类必须实现该方法或者自己声明为Instrument

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

Instrument

Instrument instrument = new ...// some class that extends from Instrument instrument.Play("some note") 的调用将通过多态和late-binding解决。它将在实现类中使用overriden方法。


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

答案 1 :(得分:0)

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

虚拟和抽象方法的重点在于它将调用派生的实现。

答案 2 :(得分:0)

  

我知道我需要一个循环遍历数组列表但不确定   如何从萨克斯和小号课程中获得播放方法以及所有这些方法   发挥相同的音符。

继承之美 - 你不需要从小号或萨克斯级别获得play方法,只需在每个play上调用Instrument方法:

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

试试吧!