【问题标题】:Create List<genericBaseClass<T>> from various List<derivedClass<T>>从各种 List<derivedClass<T>> 创建 List<genericBaseClass<T>>
【发布时间】:2012-11-06 00:30:18
【问题描述】:

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

override List<baseClass> with List<derivedClass>

不管怎样,

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

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

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

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

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

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

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 你能不能只创建一个battlescene和worlscene的父类的列表。父级将包含常用方法。由于 battelscene 和 worldscene 也是它们的父对象,因此您可以将它们存储在列表中并调用常用方法。

标签: c# list generics inheritance


【解决方案1】:

如果 Scene 的方法和属性允许,您可以定义一个 Scene 实现的 covariant generic interfaceIScene

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) ...

【讨论】:

    【解决方案2】:

    问题在于WorldSceneBattleScene 不是从同一个公共类派生的:Scene&lt;WorldModel&gt;Scene&lt;BattleModel&gt; 是两个不同的类。

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

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

    然后将列表声明为List&lt;BaseScene&gt;

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多