我的框架中的所有管理器都有一个泛型类。 (例如,entites,游戏警报,物理和粒子的管理者)。
基本上他们都做同样的事情。他们有一些东西,他们需要更新这些东西,他们需要渲染这些东西(好吧,并非所有经理都需要渲染......但无论如何)。所以我有一个通用基类就是这样做的。我定义它存储的“东西”。
public class GenericManager<T> where T : Updatable
我的游戏中的对象如实体/粒子/等继承了Updatable而我们离开了。
public class EntityManager : GenericManager<Entity>
当然,实体是
public class Entity: Updatable
现在我想知道如何将所有这些经理放入经理列表中。我需要一种方法来存储它们,迭代它们,并在另一个管理器中更新它们(我想)。
PS这可能不是处理我正在做的事情的理想方式,但这对我来说只是一个学习练习者,可以更方便地使用泛型。
答案 0 :(得分:1)
声明IGenericManager
界面,允许GenericManager<T> : IGenericManager
,您可以使用List<IGenericManager>
。
唯一的缺点是暴露的方法不能通用。
<强>更新强>
interface IGenericManager
{
Type ManagerType { get; }
}
GenericManager<T> : IGenericManager
{
public Type ManagerType { get { return typeof(T) ; } }
}
答案 1 :(得分:1)
你可以只用一个简单的空管理器界面来创建基于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>();
答案 2 :(得分:0)
您可以为基础通用管理器提取通用接口并使其协变:
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 framework 4中使用,因为在以前的版本中,泛型不能是协变的或逆变的。