You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:37:08