2013-05-21 23 views
0

我看到類似於使用繼承的東西,但我想使用接口 我想創建一個由不同對象組成的單個數組列表。包含以下對象的ArrayList |鴨,鴨,鵝,鴨,鵝,豬| 包含以下對象的ArrayList |我可以添加隨機鴨子和鵝。我想這樣做,例如讓我說我想吃鴨子,一旦我完成了鴨我可以吃另一隻鴨子,並遍歷每個項目,並運行一個「吃」的方法,例如
|我可以做以下:實現接口的不同對象的列表

public interface Animal {..} 

public class Duck implements Animal(){} 

public class Goose implements Animal{ 
    List<Animal> link = new ArrayList<Animal>; 

Goose(Duck d){ 
    link.add(d); 
} 
Goose(Goose g){ 
    link.add(g); 
} 
Goose g3 = new Goose(new Duck); 
Goose g2 = new Goose(g2); 
} 

`

+4

我發現很難理解你的問題是什麼。如果你的源代碼被格式化並且沒有語法錯誤(例如'... new ArrayList ;'應該是... ...新的ArrayList ();'在末尾帶圓括號)。 – Nick

+1

我認爲答案是「是」。您可以使用一個接口作爲類型參數。一般來說,回答這種問題的最好方法就是自己嘗試。 – jpmc26

+0

你錯過了很多可能有助於澄清的代碼。尼克建議清理它並完成它,也許我們可以提供幫助。你的代碼似乎不符合你的問題。實質上「我可以做到以下幾點:」將以「否」回答,因爲以下代碼不會吃任何鴨子,也不會從任何列表中刪除任何鴨子。 – galford13x

回答

0

你的代碼中有一些錯誤。對於鵝一部分,你可以做這樣的事情:

public class Goose implements Animal { 
List<Animal> link = new ArrayList<Animal>(); 

Goose(Duck d){ 
    link.add(d); 
} 
Goose(Goose g){ 
    link.add(g); 
} 

public static void main(String... args){ 
    Goose g3 = new Goose(new Duck()); 
    Goose g2 = new Goose(g3); 
} 

}

這意味着,如果你有界面的動物,你可以創建Animal類型的對象的列表,並與作爲實例的任何對象填充它動物(它是類擴展動物界面)。

這就是你想知道的嗎?

+0

正確。謝謝。我想基本上通過輸入創建鴨子和geeses的行。用戶輸入numRows&numCols。每行將隨機填入一個數組列表中的鵝和鴨子物體,以便我可以逐個移動每隻動物。一旦你吃第一個動物,你去第二個.... –

1

你的代碼對我來說絕對沒有意義。我想我明白你想要的是什麼。首先讓我們看看你的代碼。

你有一個Goose類實現Animal這是很好的。然後,你有一個叫班上link列表:

public class Goose implements Animal{ 
    List<Animal> link = new ArrayList<Animal>(); //remember(). 
    ... 

Goose類的每個實例都會有動物名單。這看起來很奇怪。從這個問題來看,這聽起來像是你想要一個包含動物的列表,而不是每個Goose中的列表。

然後你有兩個構造函數:

Goose(Duck d){ 
    link.add(d); 
} 
Goose(Goose g){ 
    link.add(g); 
} 

你需要無論是DuckGoose爲您添加到新Goose的內部列表輸入。每個新實例的含義都是從其列表中的DuckGoose開始。看來你想讓你的構造函數成爲add方法。

最後你有這些:

Goose g3 = new Goose(new Duck()); //You were missing() here also 
Goose g2 = new Goose(g2);   //Syntax error. Should probably be ".. new Goose(g3);" 

我不完全知道爲什麼你有這些你Goose類中,他們看起來像他們應該在別處聲明。因爲它現在每個Goose包含另外兩隻鵝,分別叫做g3g2,它們也沒什麼意義(除非它們被用作參考鵝的父母,但似乎並非如此)。

我想你想,你是如何實現它:您需要修改Goose類,以便每隻鵝只有會員相關爲每隻鵝。它看起來是這樣的(假設動物接口聲明的eat()法):

public class Goose implements Animal { 
    @Override 
    public void eat() { 
     // Om nom nom 
    } 
} 

然後,您可以移動linkg2g3main方法:

public static void main(String[] args) { 
    List<Animal> link = new ArrayList<Animal>(); 
    Goose g2 = new Goose(); 
    Goose g3 = new Goose(); 

    link.add(g2); 
    link.add(g3); 
    .. 

這樣做,你只能使用main方法中的link列表。您還可以將其作爲包含main的類的一個屬性以擴大範圍。如果你需要全球訪問,你可以創建一個包含它的類singleton(或者在某個地方使它成爲public static,但我會推薦另一種方法)。

您還可以添加一個Duck到列表中,如果Duck類實現Animal接口正確:

link.add(new Duck()); 

如果Animal接口聲明瞭一個名爲公共方法eat您可以通過列表現在循環,使所有動物吃:

for(Animal a : link) { 
     a.eat(); 
    } 

隨意評論,如果我錯過了什麼。

+0

幫助,謝謝。對不起,錯誤 我想基本上通過輸入創建鴨子和geeses行。用戶輸入numRows&numCols。每行/列將隨機填入一個數組列表中的鵝和鴨對象,以便我可以逐個遍歷每個動物。一旦你吃了第一個動物,你就去第二個......所以每一行和每列都在迭代,同時拋出它的數組列表 –

相關問題