Java Arraylist и наследование, вызывающие правильный метод.Помогите - PullRequest
0 голосов
/ 07 мая 2011

Я создал 4 класса: CD , DVD , Item и База данных . Cd и Dvd расширяются от Item .Класс База данных хранит ArrayList из Элементы .

Я застрял при создании метода в классе База данных , который вызываетотображение метода в Cd или Dvd .Однако мне удалось отобразить Cds .

Как можно отобразить все элементы?Например,

Номер элемента = 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

Ответы [ 5 ]

1 голос
/ 07 мая 2011

Вы, вероятно, должны иметь public abstract void display(); в вашем классе Item.Можно предположить, что для Items s имеет смысл показать себя.Тогда вы бы реализовали это в CD и DVD (звучит так, как будто вы уже сделали).Тогда вам не понадобится пониженная версия:

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.

0 голосов
/ 07 мая 2011
 for (int i = 0; i < items.size(); i++) {  


     Item theItem = (Item)items.get(i); 

     System.out.println("Item Number = " + i);
     theItem.display();


 }

Cast to Item вместо CD или DVD. Убедитесь, что у Item есть метод display (). Кроме того, если вы используете Java 5 или выше, взгляните на generics

0 голосов
/ 07 мая 2011

Вы ищете instanceof

if (item instanceof Cd)

Однако, как говорили другие ... это может указывать на плохой класс.Зачем вам знать, что это за тип?

0 голосов
/ 07 мая 2011

явно не разыгрывается; это побеждает цель полиморфизма. Объявите абстрактный 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();
}

Это всегда будет вызывать правильный метод.

0 голосов
/ 07 мая 2011

Вы должны получить Item из списка, а не Cd, а затем просто вызвать методы, объявленные в классе Item.Методы в подклассах будут автоматически вызываться, если они переопределяют методы.

Редактировать: только что проверил вашу диаграмму классов.Отображение метода должно быть добавлено в класс Item и переопределено подклассами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...