2014-07-15 36 views
0

我想提出一個遊戲,它採用了網格 我可以通過例如延長的ArrayList 實現:通過將其存儲我應該存儲Arraylist還是擴展它?

public class Grid 
{ 
     private ArrayList<ArrayList<obj>> objs = new ArrayList<...>(); 

     public void addObj(Obj obj, int x, int y) 
     { 
      objs.get(x).set(y,obj); 
     } 
} 

幫助PLZ

public class Grid extends ArrayList<ArrayList<obj>> 
{ 
    public void addObj(Obj obj ,int x, int y) 
    { 
      get(x).set(y,obj); 
    } 
} 

或者我應該做的

+0

@Kayaman我不認爲這是一個重複的問題。這個問題是關於如何解決這些問題的通用方法,但您可以使用該Q/A來支持您的答案。 –

+0

沒有正確的答案。從技術上講,一個網格「**是一個[n] **」ArrayList,但我會去作曲。 – keyser

+0

@LuiggiMendoza不是一個重複的否,但消息仍然非常相似。 – Kayaman

回答

1

在這種情況下,最好使用合成而不是繼承。如果您需要更改該類的特定行爲(如add方法),則只應讓您的類從ArrayList(或Java Collection Framework中的任何其他類)擴展。

順便說一下,您應該聲明變量爲List而不是ArrayList。總是將代碼導向接口而不是特定的實現類。

的代碼應該是這樣的:

public class Grid { 
    private List<List<obj>> objs = new ArrayList<List<obj>>(); 
    public void addObj(Obj obj, int x, int y) { 
     objs.get(x).set(y,obj); 
    } 
} 

更多信息:

3

後者成分的方法。 ArrayList是您現在選擇如何實現Grid的方式,但您可能希望將來使用Map或不同的List類型。

另外,ArrayList的一些方法在Grid的上下文中可能沒有意義,子列表。

1

Grid是否滿足以下條件:Grid-is-a-ArrayList?我會說不。

我寧願在這種情況下使用組合。你的網格將爲列表提供一個完全不同的(更豐富的)接口。

請注意,如果您確實需要List語義,則可以在您的Grid上實現接口java.util.List而不實際繼承實現。這將給你你想要的合同,但離開實施由你(無論你選擇委託給一個真正的名單或不...)

相關問題