2013-02-09 79 views
3

我有一個名爲iBlocks的接口數組,其中包含多個單個類(全部實現iBlocks接口)的對象。我想知道是否有可能,或者如何處理這種情況,在這種情況下,我需要調用未包含在該數組中某個類的所有對象的接口的方法。 例如:C#訪問接口數組中的對象的非接口方法

iBlocks = new iBlocks[1]; 
iBlocks[0] = new greenBlock(); 
iBlocks[1] = new yellowBlock(); 

foreach (greenBlock in iBlocks) 
{ 
    greenBlock.doStuff() 
} 

凡doStuff()是在接口沒有定義,因爲它具有在yellowBlock類沒有使用的方法。實際的界面非常出色,因爲greenBlock和yellowBlock有許多共同的特徵。但是,每個類都有特殊的方面,我希望仍然可以訪問,而不必爲每個對象類型創建一個完全獨立的數組。 在此先感謝!

+4

如果您需要調用那樣會暴露比你的界面更加的對象的方法,那麼也許你需要重新考慮這些對象與此特定類即互動的方式即使在界面上,設計也可能緊密耦合。 – 2013-02-09 04:28:10

+0

這可能有助於解釋您對界面的目的以及類之間的關係。那麼也許我們可以找到一個更靈活的設計,這將允許您避免必須強制轉換對象或檢查類型(eeewwwwww)。 – 2013-02-09 04:33:23

+0

該接口用作區域類的一個實例中存在的許多類型塊的集合。該界面處理基本命令,如獲取,設置座標,更新(用於動畫)以及啓動塊的繪製。我在項目的早期階段,預計會有更多類型的區塊。每個塊都需要實現這個相同的接口,但是當然會有獨特的操作(否則爲什麼要創建更多的類),Area類將在必要時調用。 – user2056413 2013-02-09 04:45:35

回答

6

您可以使用as運算符。

foreach (var block in iBlocks) 
{ 
    var green = block as greenBlock; 
    if (green != null) 
     green.doStuff() 
} 

或者在LINQ

foreach (var green in iBlocks.OfType<greenBlock>()) 
{ 
    green.doStuff() 
} 
+0

OfType正是我正在尋找的。評論表明,類型檢查是混亂的,雖然我沒有看到它的問題! – user2056413 2013-02-09 05:23:44