繁体   English   中英

继承泛型类的对象列表

[英]List of objects inheriting a generic class

我有一个针对我框架中所有管理器的泛型类。 (例如,entites,游戏警报,物理和粒子的管理者)。

基本上他们都做同样的事情。 他们有一些东西,他们需要更新这些东西,他们需要渲染这些东西(好吧,并非所有经理都需要渲染......但无论如何)。 所以我有一个通用基类就是这样做的。 我定义它存储的“东西”。

public class GenericManager<T> where T : Updatable

我的游戏中的对象如实体/粒子/等继承了Updatable而我们离开了。

public class EntityManager : GenericManager<Entity>

当然,实体是

public class Entity: Updatable

现在我想知道如何将所有这些经理放入经理列表中。 我需要一种方法来存储它们,迭代它们,并在另一个管理器中更新它们(我想)。

PS这可能不是一个理想的方式来处理我正在做的事情,但这对我来说真的只是一个学习练习者,使我更习惯使用泛型。

声明IGenericManager接口,让GenericManager<T> : IGenericManager ,你可以使用List<IGenericManager>

唯一的缺点是暴露的方法不能是通用的。

更新:

interface IGenericManager
{
    Type ManagerType { get; }
}

GenericManager<T> : IGenericManager
{
    public Type ManagerType { get { return typeof(T) ; } }
}

你可以只使用一个简单的空管理器界面来创建基于OfType扩展方法的列表和交集,就像这样

public interface IGenericManager { }

public class GenericManager<T> : IGenericManager where T : Updateable { }

public class EntityManager : GenericManager<Entity> { }

var list = new List<IGenericManager>();
var entityManagers = list.OfType<EntityManager>();

您可以为基础通用管理器提取通用接口并使其协变:

public class GenericManager<T> :IGenericManager<T> where T : Updatable { }

public interface IGenericManager<out T> where T : Updatable { }

public class Updatable { }

class UpdatableX : Updatable {}

class UpdatableY : Updatable {}

之后,您将能够将所有内容放入List<IGenericManager<Updatable>>

var list = new List<IGenericManager<Updatable>>
    {new GenericManager<UpdatableX>(), new GenericManager<UpdatableY>()};

更新 :忘记提及,它只能在.NET框架4中使用,因为在以前的版本中,泛型不能是协变的或逆变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM