C# 如何实现子类处理器重写指定派生类对象的处理逻辑
问题原因分析
- 你无法给
HandlerA的Handle方法加override关键字的原因是:重写要求方法签名(方法名+参数列表)和基类的virtual方法完全一致。你子类中方法的参数是ClassA,基类的参数是MyBaseClass,二者签名不匹配,你当前的写法是方法重载而非重写,两个是完全独立的方法。 HandlerA.Handle(ClassA)始终不触发的原因是:基类的Go方法是在基类编译阶段完成重载决议的,编译时只会把Handle调用绑定到基类声明的Handle(MyBaseClass)虚方法上,运行时的动态分发也只会匹配子类中重写了该签名的方法,不会自动跳转到参数更具体的重载方法。
最简解决方案
不需要修改基类代码,也不需要大量类型判断,只要在子类中重写基类的虚方法,加简单的模式匹配做分发即可:
public class HandlerA : MyBaseHandler { // 重写基类的虚方法,作为分发入口 public override void Handle(MyBaseClass obj) { // 匹配到ClassA类型走自定义逻辑 if (obj is ClassA classAObj) { Handle(classAObj); return; } // 其余类型沿用基类逻辑 base.Handle(obj); } // 原有ClassA自定义处理逻辑保留 public void Handle(ClassA obj) { // 这里的代码现在会正常触发 ... } public void Run() { Go(); } }
这个方案仅新增了3行分发逻辑,后续如果需要增加其他类型的自定义处理,只要新增对应的is匹配分支即可,维护成本极低。
内容的提问来源于stack exchange,提问作者Vilhelm H.
相关产品推荐
相关产品推荐

