Java Arraylist и наследование, вызывающие правильный метод. Справка

#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