2013-07-27 41 views
0

我正在開發像視頻出租店一樣的程序。我有兩個課程,DVD和遊戲,其中游戲擴展DVD。我正在寫一個保存和加載到textfile方法,但打了一點呃,我似乎無法弄清楚。打印作家和繼承

基本上,如果列表中的項目是一個遊戲,我需要打印作者來獲取遊戲的系統類型並將其打印到文件中。由於鏈接列表是DVD,我不確定如何進入子類遊戲。這是我保存爲文本文件中的代碼(它工作正常,如果在列表中的項目是DVD)

`public void saveAsText(String filename) throws IOException { 
    { 
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new FileWriter(filename))); 
     out.println(listDVD.size()); 
     for (int i = 0; i < listDVD.size(); i++) { 
      DVD d = listDVD.get(i); 
      out.println(d.getTitle()); 
      out.println(d.getNameOfRenter()); 
      out.println(d.boughtString()); 
      out.println(d.dBString()); 



      out.println(""); 

     } 
     out.close(); 
    } 
    }` 

我嘗試添加一些代碼來檢查,如果在索引中的項目我如果一個實例的遊戲,然後獲取系統名稱,但墜毀和燒傷相當困難。

任何幫助表示讚賞,謝謝!

+1

「應聲而燒燬相當困難「...這是什麼意思? – gparyani

+0

花式向我們展示了「一小部分代碼來檢查索引i中的項目是否是一個遊戲實例」?現在,這可能是因爲你的代碼片段不在上下文中,但似乎你有一個設計場景,你可能想要避免 - 你能告訴我們'saveAsText(...)'存在的位置,以及'listDVD'實際上屬於?最後,崩潰的堆棧跟蹤會很好。 – Tom

回答

1

直接回答你的問題,檢測項目是否實際上是一個遊戲中,你可以使用如下代碼...

if (d instanceof Game) { 
    Game g = (Game) d; 
    // access game functions here 
} 

...但是,往往是不好的Java的做法,因爲它沒有利用你設置的多態性。更好的辦法是給DVD一個方法,比如writeTo(PrintWriter),然後你可以在遊戲中重寫來編寫特定於遊戲的信息。這樣,您可以讓每個DVD子類管理自己的寫入流的過程。

邊注1:也許是我對DVD的思想作爲默認電影的錯,但我不會有遊戲擴展DVD,因爲假定每場比賽是一個 DVD而這一切,你可以做用DVD你可以做一個遊戲。 (game.pause()?)我會讓他們都實現一個通用接口(RentalItem也許?),或者擴展一個通用的抽象類,如果有代碼要重用。

邊注2:如果您不需要i除非通過列表中的每一個項目進行迭代,你可以使用不同類型的for語法代替:

for (DVD d : listDVD) { 
    d.writeTo(out); 
} 
+0

BRILLIANT!我的問題是試圖找出如何將遊戲變量分配給列表中的項目.... cast it! 至於設計問題,我同意你的看法,但是設計被傳下來了,我不會去改變它。 –