You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:39:04