2

在某些情况下-这是对先前问题的扩展。

用 List<derivedClass> 覆盖 List<baseClass>

反正,

我有一个通用基类“场景”

public class Scene<T> where T: SceneModel { }

我还有两个继承自这个的类:

public class WorldScene : Scene<WorldModel> { }
public class BattleScene : Scene<BattleModel> { }

现在我需要做的是拥有一个List<Scene<SceneModel>>包含 WorldScene 和 BattleScene 的混合物。在我需要列表的地方,我显然只需要使用 WorldScene 和 BattleScene 共有的属性/方法。

我知道它们是两个截然不同的对象-但鉴于它们继承自同一事物-我希望有一些巧妙的方法可以以这种方式对它们进行分组,而无需手动将它们转换为第三种类型。

4

2 回答 2

5

如果 Scene<T> 的方法和属性允许,您可以定义一个协变通用接口IScene<out T> ,该接口实现了 Scene<T> :

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) ...
于 2012-11-06T00:46:03.257 回答
0

问题是WorldSceneandBattleScene不是从同一个公共类派生的:Scene<WorldModel>andScene<BattleModel>是两个不同的类。

我将介绍一个基类 - 或一个接口 - 来声明您需要使用的功能:

public class Scene<T> : BaseScene where T: SceneModel { }

然后将列表声明为List<BaseScene>

于 2012-11-06T00:48:52.363 回答