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

调用基类方法时返回与子类相同类型的替代实现方案咨询

实现无需显式指定泛型参数的GetList()方法

当然有办法实现你想要的调用方式!你可以通过**泛型基类结合奇异递归模板模式(CRTP)**来达成这个需求,这样子类调用GetList()时会自动返回对应自身类型的List,不用手动指定泛型参数。

具体实现代码

首先定义泛型基类,通过类型约束让子类必须将自身作为类型参数传入:

public class Figure<T> where T : Figure<T>
{
    public List<T> GetList()
    {
        var list = new List<T>();
        // 在这里添加填充列表的通用逻辑,比如初始化或添加元素
        return list;
    }
}

然后让你的子类继承这个泛型基类,并传入自身作为类型参数:

public class Rectangle : Figure<Rectangle> { }
public class Cube : Figure<Cube> { }

调用方式(完全符合你的需求)

Rectangle rec = new Rectangle();
List<Rectangle> lRec = rec.GetList(); // 无需指定泛型参数,自动返回List<Rectangle>

Cube cube = new Cube();
List<Cube> lCube = cube.GetList(); // 同理返回List<Cube>

原理说明

这种方式利用了奇异递归模板模式(CRTP),让基类在编译时就知晓子类的具体类型。基类中的GetList()方法返回的List<T>里的T就是子类本身,这样既复用了基类的通用逻辑,又能让子类调用时获得强类型的列表,完美匹配你想要的简洁调用方式。

如果后续需要让基类支持非泛型的场景(比如统一的基类接口),还可以额外定义一个非泛型的IFigure接口,让泛型基类实现它,但就你的当前需求而言,上面的方案已经足够好用。

内容的提问来源于stack exchange,提问作者infCAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:55