2011-12-14 34 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