调用基类方法时返回与子类相同类型的替代实现方案咨询
实现无需显式指定泛型参数的
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
相关产品推荐
相关产品推荐

