"虚拟列表"在C#中避免继承类中的类型转换?

时间:2011-12-14 18:28:48

标签: c# inheritance casting

假设我有一个名为Player的抽象类。类GameAPlayerGameBPlayer继承自Player。反过来,一些抽象类分别从GameAPlayerGameBPlayer继承。

假设我有另一个名为Engine的抽象类,它托管List<Player>。类GameAEngineGameBEngine都继承自Engine。我知道GameAEngine中的所有玩家都属于GameAPlayer类型,而GameBEngine中的所有玩家都属于GameBPlayer类型。

我无法将List<Player>移至GameAEngineGameBEngine,因为我正在使用Engine本身的列表。

每次我在各自的引擎中使用列表时,必须将Player强制转换为GameAPlayerGameBPlayer,这似乎是不洁净的。我有什么方法可以避免这样做吗?

2 个答案:

答案 0 :(得分:6)

您正在经历所谓的“并行层次结构问题”的痛苦。历史上,面向对象语言在处理并行层次结构问题方面做得很差。

关于这个问题以及各种技术如何处理它有很多有趣的讨论;没有扣篮解决方案。您可以从阅读本讨论开始:

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

此外,还有关于此区域的批次 Stack Overflow问题。

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

答案 1 :(得分:3)

Engine更改为Engine<TPlayer> where TPlayer : Player 请注意,这将使基本引擎在任何地方都需要泛型类型参数;你可以使用非通用接口解决这个问题。

或者,在执行转换的派生类中创建一个GetPlayer方法,并使用它而不是基本列表。