C#自引用泛型约束:Unity对象池IPoolObject绑定所属池问题
解决对象池与池对象的关联问题
你提到的Foo : IPoolObject<Foo>这种递归泛型模式,正是解决该问题的核心方案。以下是具体实现步骤:
1. 重构泛型版IPoolObject接口
将原非泛型接口改为带递归约束的泛型接口,要求实现类把自身作为类型参数传入,让SetPool方法能精准接收对应自身类型的对象池:
public interface IPoolObject<T> where T : IPoolObject<T> { void SetPool(IPool<T> pool); }
2. 调整IPool类的泛型约束
同步修改对象池类的约束,适配新的泛型接口:
public class IPool<T> : MonoBehaviour where T : IPoolObject<T> { // 示例:获取对象时绑定所属池 public T GetObject() { T obj = /* 你的对象创建/取出逻辑 */; obj.SetPool(this); return obj; } // 示例:回收对象的方法 public void ReturnObject(T obj) { /* 你的对象回收逻辑 */ } }
3. 实现具体池对象类
以Foo类为例,需实现泛型接口并指定自身为类型参数:
public class Foo : IPoolObject<Foo> { private IPool<Foo> _owningPool; public void SetPool(IPool<Foo> pool) { _owningPool = pool; } // 示例:调用所属池回收自身 public void ReturnToPool() { _owningPool?.ReturnObject(this); } }
原写法失效的原因
原代码中IPool<Foo>无法转换为IPool<IPoolObject>,是因为C#泛型默认具备不变性:除非用out(协变)或in(逆变)显式修饰泛型参数,否则不同类型参数的泛型类/接口无法互相转换。而递归泛型接口正好解决了类型精准匹配的需求。
内容的提问来源于stack exchange,提问作者Mike Cook
相关产品推荐
相关产品推荐

