2011-05-07 70 views
0

我創建了4類:DVD項目數據庫Cd and Dvd延伸自商品數據庫類存儲ArrayList項目Java Arraylist和繼承調用正確的方法。幫助

我卡上創建的數據庫的方法,它調用在任何DVD的方法顯示。不過,我設法顯示Cds

如何顯示所有項目?例如。

項目數= 1張
CD

項目數= 2
DVD

項目數量= 3

非常感謝。

編輯

的顯示方法在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 

    } 

} 

我的類圖:

Class Diagram http://img571.imageshack.us/img571/1460/unledsca.png

回答

0

你應該從列表中獲取項目,而不是CD,然後只需調用在項目類中聲明的方法。如果子類重寫方法,子類中的方法將自動被調用。

編輯:剛剛檢查了你的classdiagram。方法顯示應該添加到Item類中,並由子類重寫。

+0

顯示方法不同於cd和dvd – Sanjay 2011-05-07 17:12:50

0

您正在尋找instanceof

if (item instanceof Cd) 

然而,正如其他人所說的......它可能向壞的一流的設計點。爲什麼你需要知道類型是什麼?

+1

確實,但這並不是一個好的整體解決方案。 – 2011-05-07 16:55:17

+0

是啊......我來回踱步,現在怎麼編輯。在某些情況下,'instanceof'可能有意義,但我不知道這是一個。 – 2011-05-07 16:56:06

0

不明確投射;這打破了多態的目的。在您的Item基類中聲明一個摘要display方法,然後在CdDvd中覆蓋它。

然後你的循環可以是:

List<Item> my_list = new ArrayList<Item>(); 

... 

for (int i = 0; i < items.size(); i++) { 
    System.out.println("Item number = " + i); 
    items[i].display(); 
} 

這將始終調用正確的方法。

1

您可能應該在Item課程中有public abstract void display();。可以想象,Itemss能夠顯示自己是有意義的。然後你會在CDDVD(聽起來像你已經擁有)實現它。然後,你已經沒有必要垂頭喪氣:

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
for (int i = 0; i < items.size(); i++) { 


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

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


} 

轉換爲項目而不是CD或DVD。確保Item有一個display()方法。 另外,如果您使用的是Java 5或以上版本,請看看generics