2013-09-17 7 views
0

Ok ребята У меня есть абстрактный класс InstrumentАбстрактный класс ArrayList ToString

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

Я использую класс саксофон и трубу для расширения и реализации абстрактного метода

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

Sax

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

} 

Это не обязательно должно быть в массиве, я просто подумал, что это упростит управление. Я считаю, что у меня все прямо до сих пор, но моя проблема возникает в методе воспроизведения в группе, она должна отображать игру под названием инструмента, при этом все инструменты играют одну и ту же ноту.

Пример драйвера:

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

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

Выход:
Анна играет Sax: Dum да-да-ДУМ
Leon играет на трубе: Dum-да-да Dum
Бен играет на саксофоне: Dum da- da DUM

Я знаю, что мне нужен цикл, чтобы перебирать список массивов, но не уверен, как получить метод воспроизведения из класса sax и trumpet, и все они играют одну и ту же ноту.

Спасибо за любую помощь!

Я обновил свой код с контуром, но это выход я получаю:

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

Как вы его настроили, ваш цикл будет воспроизводить только первый инструмент и вернуться. Если вы хотите вывести то, что все они играют, вы должны конкатенировать возвращаемые значения и возвращаться один раз после завершения цикла. Для конкатенации взгляните на 'StringBuilder'. –

+0

'Band', вероятно, не должен наследовать' Instrument'. – SLaks

+0

Какой результат вы ожидаете? –

ответ

1

Класс Instrument объявляет метод abstract под названием Play с параметром String. Таким образом, все классы, которые простираются от Instrument, должны либо реализовать метод, либо быть объявлены как abstract.

Поскольку тип Instrument объявил такой метод, вы можете позвонить ему по любой ссылке этого типа.

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

Вызов Play() будет решен через полиморфизм и late-binding. Он использовал бы метод overriden в реализующих классах.


Java именования утверждают, что методы должны начинаться с буквенного символа в нижнем регистре и использовать camelCase.

+0

Хорошо спасибо, я думаю, что мне нужно просто пройти через арраист и вызвать метод игры. Метод имеет возвращаемый тип строки, каково должно быть мое фактическое возвращение? – user2745043

+0

Если метод возвращает 'String', и вы хотите его отобразить, вам следует использовать один из методов' System.out.print() '. –

+0

@ user2745043 Результат 'quiz.Sax @ 381172c5', который вы видите, является значением' String', возвращаемым методом 'Object # toString()', вы должны реализовать свой собственный метод 'toString()' в каждом из ваших классов. –

0

Вы можете просто петля через ArrayList и вызвать базу (абстрактную) play() метода.

Весь смысл виртуальных и абстрактных методов заключается в том, что это вызовет производную реализацию.

+0

Хорошо достаточно га, как для возвращаемого типа строки, что мне нужно для возврата? Вернул бы нулевую работу? – user2745043

+0

@ user2745043: Это плохая идея; см. http://en.wikipedia.org/wiki/Liskov_substitution_principle. Если 'Band' является' Instrument', он должен вести себя точно так же, как и любой другой инструмент. IOW, он должен вернуть большую строку и ничего не печатать. – SLaks

0

Я знаю, что мне нужен цикл для перебора списка массива, но не уверен, как получить метод воспроизведения из саксофона и трубы класса и их все играют ту же ноту.

Красота наследования - вам не нужно, чтобы получить метод воспроизведения из трубных или саксофона классов, вы просто вызвать метод play на каждом Instrument:

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

Попробуй!

Смежные вопросы