.NET Core 7中实现接口的类能否返回自身类型?
解决静态抽象接口成员返回具体类型的问题
用泛型接口实现返回自身类型
无需改用继承方案,通过给接口添加自约束的泛型参数,就能让Create方法直接返回实现类的具体类型,示例代码如下:public interface IRegularPolygon<TSelf> where TSelf : IRegularPolygon<TSelf> { static abstract TSelf Create(int sideLength); int SideLength { get; } int GetPerimeter(); } public class Hexagon : IRegularPolygon<Hexagon> { public int SideLength { get; } private Hexagon(int sideLength) { SideLength = sideLength; } public static Hexagon Create(int sideLength) { return new Hexagon(sideLength); } public int GetPerimeter() { return SideLength * 6; } }调用时直接使用
var hex = Hexagon.Create(5);即可,不需要强制类型转换,完全符合编译器的类型检查要求。直接返回具体类型报错的原因
.NET 7对静态抽象接口成员的实现要求签名严格匹配接口定义。如果接口定义的Create方法返回IRegularPolygon,那么实现类必须返回相同的接口类型——静态方法不支持返回值协变,这和实例方法的协变规则不同,因此返回Hexagon会触发编译错误。是否需要改用继承方案
不需要。继承方案虽然能实现类似的创建逻辑,但泛型接口的方式更贴合面向接口编程的设计原则,同时保留了静态创建方法的便利性,避免了继承带来的类层级耦合问题。若改用基类实现,只能依赖实例方法完成对象创建,无法保留静态方法的调用模式。
内容的提问来源于stack exchange,提问作者Aurélien
相关产品推荐
相关产品推荐

