对于某些情境 - 这是早期问题的扩展。
override List<baseClass> with List<derivedClass>
反正
我有一个通用的基类“场景”
public class Scene<T> where T: SceneModel { }
我还有两个继承自此的类:
public class WorldScene : Scene<WorldModel> { }
public class BattleScene : Scene<BattleModel> { }
现在我需要做的是List<Scene<SceneModel>>
包含WorldScene和BattleScene的混合物。在我需要列表的地方,我显然只需要使用WorldScene和BattleScene常用的属性/方法。
我知道它们是两个截然不同的对象 - 但是假设它们继承了同样的东西 - 我希望有一种聪明的方法可以用这种方式对它们进行分组,而无需手动将它们转换为第三种类型。
答案 0 :(得分:5)
如果Scene&lt; T&gt;的方法和属性允许它,你可以定义covariant generic interface IScene&lt; out T&gt;哪个场景&lt; T&gt;实现:
public interface IScene<out T> where T : SceneModel { }
// use of T is limited to return values and out parameters
public class Scene<T> : IScene<T> where T : SceneModel { }
List<IScene<SceneModel>> list = new List<IScene<SceneModel>>();
list.Add(new WorldScene());
list.Add(new BattleScene());
foreach (IScene<SceneModel> scene in list) ...
如果没有,您可以使用非泛型接口或非泛型基类,但不能在定义中包含泛型成员:
public interface IScene { }
// no T
public class Scene<T> : IScene where T : SceneModel { }
List<IScene> list = new List<IScene>();
list.Add(new WorldScene());
list.Add(new BattleScene());
foreach (IScene scene in list) ...
答案 1 :(得分:0)
问题是WorldScene
和BattleScene
不是来自同一个公共类:Scene<WorldModel>
和Scene<BattleModel>
是两个不同的类。
我将介绍一个基类 - 或接口 - 声明您需要使用的功能:
public class Scene<T> : BaseScene where T: SceneModel { }
然后将列表声明为List<BaseScene>