如何实现参数及返回值为实现类类型的泛型抽象函数?
实现方案说明
这个需求其实是典型的递归泛型场景,你原本的写法直接在抽象方法上添加泛型约束是行不通的,但我们可以通过调整抽象类的定义来完美实现你想要的效果。
正确的抽象类定义
首先要把泛型参数放到类级别,并加上递归约束,确保子类继承时传入的泛型类型就是自身:
public abstract class BaseClass<T> where T : BaseClass<T> { public abstract T DoSomething(T variable); }
子类实现示例
这样你的具体子类就可以按照预期的方式重写方法,参数和返回值都限定为子类自身:
public class Class1 : BaseClass<Class1> { public override Class1 DoSomething(Class1 variable) { // 这里编写你的业务逻辑 Console.WriteLine($"处理Class1实例:{variable}"); return variable; } }
为什么原写法不可行?
你最初尝试在抽象方法上定义泛型T并加约束,这种写法的问题在于:子类重写时可以返回任意继承自父类的类型,而不是必须返回自身,完全无法满足你“参数和返回值均为实现类本身”的要求。
而递归泛型约束where T : BaseClass<T>是C#里实现“自类型”需求的常用方案,虽然它不能从语法上完全强制子类必须传入自身类型(比如有人可以恶意写class BadClass : BaseClass<Class1>),但在常规的开发规范下,大家都会遵循传入自身类型的约定,完全能覆盖你的实际业务场景。
内容的提问来源于stack exchange,提问作者Kyoshiro Kokujou Obscuritas
相关产品推荐
相关产品推荐

