假设我有一个名为Player
的抽象类。类GameAPlayer
和GameBPlayer
继承自Player
。反过来,一些抽象类分别从GameAPlayer
和GameBPlayer
继承。
假设我有另一个名为Engine
的抽象类,它托管List<Player>
。类GameAEngine
和GameBEngine
都继承自Engine
。我知道GameAEngine
中的所有玩家都属于GameAPlayer
类型,而GameBEngine
中的所有玩家都属于GameBPlayer
类型。
我无法将List<Player>
移至GameAEngine
和GameBEngine
,因为我正在使用Engine
本身的列表。
每次我在各自的引擎中使用列表时,必须将Player
强制转换为GameAPlayer
和GameBPlayer
,这似乎是不洁净的。我有什么方法可以避免这样做吗?
答案 0 :(得分:6)
您正在经历所谓的“并行层次结构问题”的痛苦。历史上,面向对象语言在处理并行层次结构问题方面做得很差。
关于这个问题以及各种技术如何处理它有很多有趣的讨论;没有扣篮解决方案。您可以从阅读本讨论开始:
http://lambda-the-ultimate.org/node/1621
此外,还有关于此区域的批次 Stack Overflow问题。
答案 1 :(得分:3)
将Engine
更改为Engine<TPlayer> where TPlayer : Player
请注意,这将使基本引擎在任何地方都需要泛型类型参数;你可以使用非通用接口解决这个问题。
或者,在执行转换的派生类中创建一个GetPlayer
方法,并使用它而不是基本列表。