2013-06-19 32 views
1

我正在嘗試使用C#(使用與該問題無關的XNA)製作2D遊戲。我製作了一個基本的貼圖類,遊戲中的所有貼圖都將繼承基本功能,例如如何將自己繪製到屏幕等等。在多個類類型的列表中調用特定的類功能

那麼我有什麼是基本拼貼類持有每一個其他類從基類,繼承了IE瀏覽器的列表:門,牆壁,地板,瓷磚等

List<TileBase> tileList = new List<TileBase>(); 

    ... 

    tileList.Add(new Door(arguments)); 
    tileList.Add(new Wall(arguments)); 

問題來了稍後當我只想影響該列表內的某種類型的類時。例如,門具有Open(),Close()和Toggle()的某些功能。 如果我嘗試只是讓一個循環通過每門級循環在我的名單:

foreach(Door door in tileList) 
    { 
      door.Toggle(); 
    } 

我得到一個錯誤:

"Unable to cast object of type '...Tiles.Wall' to type '...Tiles.Door'." 

所以基本上,我有一個完整不同類別的清單。如何在循環中的類中實現特定函數而不會使程序崩潰,因爲它試圖在不具有所述函數的另一類類上進行嘗試。

回答

1

你可以調查OfType方法,它過濾基於類型:

using System.Linq; 

...

foreach(var door in tileList.OfType<Door>()) 
{ 
    door.Toggle(); 
} 
+1

@ user2499152'沽使用System.Linq的;'你的文件的頂部,這樣'OfType'將在範圍之內。 –

+0

絢爛!似乎工作,感謝您的快速反應!這一定會派上用場。我很高興解決方案很簡單,因爲我很難找到任何類似的問題。謝謝! :) – Khan

0

可以遍歷使用基類,然後檢查spesific對象的實例類Door。如果是,則投射到Door對象。

foreach(TileBase td in tileList) 
{ 
     if(td is Door) 
     { 
      ((Door) td).Toggle(); 
     } 
} 
+0

這可能(稍微)比OfType效率低,因爲它會迭代未使用的對象。我認爲@Khan會對比賽表現感興趣,因爲這是一場比賽。 – Squid

+0

我曾嘗試類似的東西,但對我而言,它當時並不奏效。看來我需要在td和(Door)周圍放置圓括號。所以現在我有兩種可能的解決方案,我應該在將來需要類似的東西!謝謝! – Khan

0
foreach(Door door in tileList.where(a=>a is Door)) 
{ 
    door.Toggle(); 
} 
相關問題