#java #inheritance
#java #наследование
Вопрос:
Я создал 4 класса: Cd, Dvd, Item и Database. Cd и Dvd начинаются с элемента. Класс Database хранит ArrayList
множество элементов.
Я застрял на создании метода в классе Database, который вызывает метод display либо на Cd, либо на Dvd. Однако мне удалось отобразить компакт-диски.
Как можно отобразить все элементы? Например.
Номер элемента = 1
CDНомер элемента = 2
DVDНомер элемента = 3
Cd
Большое спасибо.
Редактировать:
Методы отображения отличаются на Cd и Dvd.
public void displayAll() {
for (int i = 0; i < items.size(); i ) {
Cd theCd = (Cd) items.get(i);
// Dvd theDVD = (Dvd) items.get(i);
System.out.println("Item Number = " i);
theCd.display();
// theDvd.display
}
}
Моя диаграмма классов:
Диаграмма классов http://img571.imageshack.us/img571/1460/unledsca.png
Ответ №1:
Вероятно, у вас должен быть public abstract void display();
в вашем Item
классе. Можно было бы предположить, что для Items
s имеет смысл иметь возможность отображать себя. Затем вы бы реализовали это в CD
и DVD
(похоже, у вас уже есть). Тогда вам не понадобился бы downcast:
public void displayAll()
{
for (int i = 0; i < items.size(); i ) {
Item item = (Item) items.get(i);
System.out.println("Item Number = " i);
item.display();
}
}
И если вы используете версию JDK, поддерживающую обобщения, рассмотрите возможность использования ArrayList<Item>
вместо ArrayList
. Тогда вы также можете избавиться от Item
приведения.
Ответ №2:
Вы должны получить элемент из списка, а не компакт-диск, затем просто вызвать методы, объявленные в классе Item. Методы в подклассах будут автоматически вызваны, если они переопределяют методы.
Редактировать: Только что проверил вашу classdiagram. Метод display должен быть добавлен в класс Item и переопределен подклассами.
Комментарии:
1. методы отображения отличаются на cd и dvd
Ответ №3:
Вы ищете instanceof
if (item instanceof Cd)
Однако, как говорили другие … это может указывать на плохой дизайн класса. Зачем вам нужно знать, что это за тип?
Комментарии:
1. Да… Я возвращался к этому и далее, и как теперь отредактировано. Есть случаи, когда
instanceof
могут иметь смысл, но я не уверен, что это один из них.
Ответ №4:
Не приводите явно; это противоречит цели полиморфизма. Объявите абстрактный display
метод в вашем Item
базовом классе, а затем переопределите его в Cd
и Dvd
.
Тогда ваш цикл может быть:
List<Item> my_list = new ArrayList<Item>();
...
for (int i = 0; i < items.size(); i ) {
System.out.println("Item number = " i);
items[i].display();
}
Это всегда будет вызывать правильный метод.
Ответ №5:
for (int i = 0; i < items.size(); i ) {
Item theItem = (Item)items.get(i);
System.out.println("Item Number = " i);
theItem.display();
}
Приведение к элементу вместо CD или DVD. Убедитесь, что у элемента есть метод display().
Кроме того, если вы используете Java 5 или выше, взгляните на generics