2011-12-14 53 views
0

假設我有一個叫做Player的抽象類。類GameAPlayerGameBPlayer繼承自Player。反過來,幾個抽象類分別從GameAPlayerGameBPlayer繼承。C#中的「虛擬列表」,以避免在繼承類中的類型轉換?

假設我有另一個叫做Engine的抽象類,它承載List<Player>。類GameAEngineGameBEngine都從Engine繼承。我知道GameAEngine中的所有球員都是GameAPlayer類型的球員,並且GameBEngine中的所有球員都屬於GameBPlayer類型。

,因爲我使用Engine本身名單我不能移動List<Player>GameAEngineGameBEngine

必須將類型轉換Player轉換爲GameAPlayerGameBPlayer每次我在各自的引擎中使用列表看起來似乎是不清楚的。有什麼辦法可以避免必須這樣做嗎?

+1

簡單的解決辦法是擺脫多餘的類和屬性添加到類。你有權質疑你的設計,它是不乾淨和無效的。 – 2011-12-14 19:00:27

回答

3

變化Engine變爲Engine<TPlayer> where TPlayer : Player
請注意,這將使基礎引擎在任何地方都需要泛型類型參數;您可以使用非通用接口解決該問題。

或者,在執行轉換的派生類中創建一個GetPlayer方法,並使用該方法代替基本列表。

+0

第一種技術使引擎過於「以玩家爲中心」。我曾考慮過使用第二種方法,但試圖看看有沒有更好的東西。我想我會走那條路。 – 2011-12-15 07:04:52

6

您正在經歷所謂的「並行層次問題」的痛苦。歷史上面向對象的語言在處理並行層次結構問題方面做得很差。

關於這個問題有很多有趣的討論,以及各種技術如何處理它;沒有滿貫的解決方案。你可以通過閱讀這篇討論開始:

http://lambda-the-ultimate.org/node/1621

此外,還有許多關於這方面的堆棧溢出問題爲好。

https://stackoverflow.com/search?q=parallel+hierarchies

+0

+1給我這個問題的期限。一旦你確切地知道你在找什麼,總是更容易研究它:) – 2011-12-15 07:03:22