2011-11-24 64 views
1

我正在研究一個圖書館用於紙牌遊戲。我花了幾個小時學習索引器,所以我可以有一個類似卡片類型的Deck類。然後,我通過從ArrayList繼承來實現同樣的事情和更多。因此,我問爲什麼當通過「:ArrayList」可以實現同樣的事情(以及更多)時,可能會遇到製作類可索引的麻煩。使用從ArrayList或List繼承的索引器VS <T>?

我想我的問題是不言自明的,但對於那些誰喜歡看代碼。

這裏是我的甲板類,它包含一個索引:

class DeckIndexer 
{ 
    private Card[] myData; 
    private int arrSize; 



public DeckIndexer(int size) 
{ 
    arrSize = size; 
    myData = new Card[size]; 

    for (int i = 0; i < size; i++) 
    { 
     myData[i] = null; 
    } 
} 

public Card this[int pos] 
{ 
    get 
    { 
     return myData[pos]; 
    } 
    set 
    { 
     myData[pos] = value; 
    } 
} 

public Card this[Card c] 
{ 
    get 
    { 
     int count = 0; 

     for (int i = 0; i < arrSize; i++) 
     { 
      if (myData[i] == c) 
      { 
       count++; 
      } 
     } 
     return c; 
    } 
    set 
    { 
     for (int i = 0; i < arrSize; i++) 
     { 
      if (myData[i] == c) 
      { 
       myData[i] = value; 
      } 
     } 
    } 
    } 
} 

現在,這裏是第二個解決方案,從ArrayList中

class DeckInheritence : ArrayList 
    { 

    } 

第二個解決方案傳承給了我20多個免費的方法,[ ]語法,然後保存我很多行代碼。第一個給我[]語法,連接到對象的方法,很難實現。

BTW,是的,我可以看到的ArrayList是給我的物體,不卡的數組,但沒有太多的不了了之得到它需要一個卡類型。

+0

'arrSize'可以是代表與'myData.Length'搭配,不需要兩次。 – Firo

回答

1

首先,除非你在.NET 1.1,List<Card>將是優選的。然而,至於繼承...如果你所做的只是代表一張卡片列表,我會只使用List<Card>(既不封裝也不繼承)。

對於爲什麼;當列表是一個列表不是一個類型的主要目的時,封裝是有用的,但對於調用者有權訪問像索引器這樣的幾個方法是非常有用的。正如喬恩指出的,繼承沒有(例如)讓你控制什麼用戶到您的數據。

就個人而言,我不建議從List<T>(或ArrayList)繼承;它將實現細節綁定到實際的類型聲明中(更改繼承是一個突破性更改)。

如果你想以最少的工作暴露很多方法,你所需要做的就是提供IEnumerable<T>(作爲一個接口) - 那麼所有的LINQ變得可用。所以如果你需要的東西定製(超過List<Card>)我的建議是:

  • 封裝List<T>(即私有字段)
  • 實施IEnumerable<T>如果合適的話(只是返回theList.GetEnumerator()
  • 添加任何你想要的特定成員(索引等)
+0

好的。我會盡力而爲。謝謝! – endlessnameless

2

基本上a Deck而不是ArrayListList<Card>。你想讓來電者能夠添加儘可能多的卡片嗎?我對此表示懷疑。空值或重複值如何?再次,不太可能有用。

這是使用組合而不是繼承的完美情況。我不會直接在類型中使用數組 - 我會使用List<T> - 但您幾乎肯定希望爲您的套牌編寫更多特定於域的代碼。有明顯的限制,甲板特定的操作等。你真的想要訪問任何項目的甲板?例如,我希望你希望能夠向玩家交易一套牌,並對其進行洗牌。

的目標應該是要創造於適當地代表您的域名類型 - 不給你用線最少的代碼索引。

+0

有趣的建議Jon。我會冥想那個。我並沒有真正處於編程階段,但是我太過於擔心阻止一個對象能夠做什麼。我想我只是想,如果我不需要我不會使用他們的方法嘿。當然,我是唯一一個使用我的課程的人,所以這可能是我錯誤的觀點。謝謝。 – endlessnameless