无需编译器技巧实现泛型类型转换,如何依赖编译时检查?
解决方案
可以通过**奇异递归模板模式(CRTP)**重构类层次结构,利用编译时泛型约束消除丑陋的类型转换,同时保证类型安全。
重构后的代码(兼容原有非泛型接口)
public interface IProcessor { Task<IProcessor> Run(); } // 抽象类通过泛型约束绑定子类类型 public abstract class Processor<TProcessor> : IProcessor where TProcessor : Processor<TProcessor> { // 提供强类型的Run方法,编译时即可确认返回类型 public async Task<TProcessor> Run() { await DoWork(); return this as TProcessor; // 泛型约束保证类型匹配,编译安全 } // 显式实现非泛型接口方法,兼容原有契约 async Task<IProcessor> IProcessor.Run() => await Run(); protected abstract Task DoWork(); } public sealed class FooProcessor : Processor<FooProcessor> { protected override Task DoWork() => Task.CompletedTask; }
简化版(仅保留泛型接口)
如果不需要兼容原有非泛型IProcessor,可以进一步精简:
public interface IProcessor<TProcessor> where TProcessor : IProcessor<TProcessor> { Task<TProcessor> Run(); } public abstract class Processor<TProcessor> : IProcessor<TProcessor> where TProcessor : Processor<TProcessor> { public async Task<TProcessor> Run() { await DoWork(); return this as TProcessor; } protected abstract Task DoWork(); } public sealed class FooProcessor : Processor<FooProcessor> { protected override Task DoWork() => Task.CompletedTask; }
核心说明
- 抽象类
Processor<TProcessor>通过泛型约束where TProcessor : Processor<TProcessor>,强制子类必须将自身作为泛型参数传入,编译器能在编译时确认this的类型就是TProcessor,彻底避免了绕到object的强制转换。 - 子类继承时只需传入自身类型(如
FooProcessor : Processor<FooProcessor>),调用Run方法会直接返回对应子类的强类型实例,完全依赖编译时检查保证类型安全。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

