继承泛型类的对象列表

本文关键字:列表 对象 泛型类 继承 | 更新日期: 2023-09-27 18:13:24

我有一个通用类的所有管理器在我的框架。(例如实体、游戏警报、物理和粒子的管理器)。

本质上它们都做同样的事情。他们有一个东西的集合,他们需要更新这些东西,他们需要渲染这些东西(好吧,不是所有的管理器都需要渲染……但无论如何)。我有一个通用基类来做这个。我定义了它存储的"东西"。

public class GenericManager<T> where T : Updatable

和对象在我的游戏,如实体/粒子/等继承Updatable和我们离开。

public class EntityManager : GenericManager<Entity>

当然,实体是

public class Entity: Updatable

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

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

继承泛型类的对象列表

您可以使用一个简单的空管理器接口来基于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>();

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

唯一的缺点是公开的方法不能是泛型的。

更新:

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

您可以为您的基泛型管理器提取泛型接口并使其协变:

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>()};

UPDATE:忘了说,这只在。net framework 4中是可能的,因为在以前的版本中,泛型不能协变或逆变。