2012-05-28 43 views
2

我有一個約100個對象的列表,這恰好是瓷磚。它看起來像這樣:如何確定我在列表中引用哪個子類?

List<Tile> Tiles; 

其他地方在我的代碼我有一個從瓦基類派生的類,我會用房子這個例子:

public class house : Tile 

在列表內往上頂的我添加了不同類型的瓷磚的數據結構:

Tiles.add(new house()); 
Tiles.add(new church()); //ect. ect. 

我的問題是我怎麼知道哪些磚是教堂或房子,如果我在哪裏可以通過控制結構,引用列表就像一個for循環。基本上我需要比較兩種不同類型的瓷磚。甚至有可能知道我參考的是哪個孩子類?我確信對此有一個簡單的解釋,但是當涉及到面向對象的編程時,我並不十分精通,因此我甚至不完全確定當涉及到幫助時我應該尋找什麼。

+0

我推薦重新設計,所以你不需要知道孩子類型是什麼。在下面的回答中添加一個像@MarcGravell這樣的虛擬方法。 – Brady

回答

5

有多種選擇這裏

  • 可以使用is/as檢查特定對象,以確定它是一種特殊類型
  • 您可以添加一個鑑別的 - 也許一個枚舉屬性,如.TileType(比較:Expression.NodeType)
  • 您可以改爲使用virtual方法,以便您不要需要才能知道類型是什麼:你只是說「做你的類型在這裏做什麼」(即調用虛擬方法)
+0

+1,我同意,代碼應該不需要知道的正確設計。 – Brady

+0

這正是我要找的。非常感謝你 –

0
foreach (Tile tile in Tiles) 
{ 
    if (tile is house) 
    { 
     // do things 
    } 
} 

您可以使用像上面那樣的關鍵字。

2

您可以使用「是」經營者 - 「瓷磚[索引]房子」

但總的來說這是一個糟糕的事情 - 你打破接力原則

你應該在派生類中實現該方法,以便他們知道如何執行自己的邏輯,而不必使用「is」運算符。

+0

如果你會寫你正在嘗試做的事情,我可以嘗試寫一個例子 – eyossi

1

嗯,你可以這樣做:

foreach (var house in Tiles.OfType<house>()) { .. 
相關問題