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

C#中使用override修饰的virtual虚方法未被重写输出异常如何解决

问题根因

你当前的实现完全没有关联用户继承IDebug的自定义实现类,每次触发日志事件时都会新建内部Call类的实例,调用base.Event只会执行IDebug父类的默认逻辑,自然永远输出test,和用户编写的重写方法没有任何关系。

修复方案

调整静态Debug类的逻辑,新增公开的自定义实现注册入口,删除无用的内部Call类即可:

public static class Debug
{
    // 允许用户注册自定义的调试处理器,默认走父类实现
    public static IDebug CustomDebugger { get; set; } = new IDebug();

    internal static void CallObjectEvent(string log)
    {
        CustomDebugger.Event(new Log(log, Timer.GetTime()));
    }
}

// 原IDebug定义不变
public class IDebug
{
    public virtual void Event(Log log) {Console.WriteLine("test");}
}

用户使用时只需在程序初始化阶段注册自己的实现:

class Program : IDebug
{
    public override void Event(Log log)
    {
        Console.WriteLine(log.log);
    }

    static void Main(string[] args)
    {
        // 注册自定义调试实现
        Debug.CustomDebugger = new Program();
    }
}

替代实现方案

如果不需要强制用户继承类,用事件订阅模式更灵活,且不需要修改原有静态类的核心逻辑:

public static class Debug
{
    // 公开日志事件,支持多订阅者
    public static event Action<Log> LogEmitted;

    internal static void CallObjectEvent(string log)
    {
        LogEmitted?.Invoke(new Log(log, Timer.GetTime()));
    }
}

用户无需继承任何类,直接订阅事件即可实现自定义逻辑:

class Program
{
    static void Main(string[] args)
    {
        Debug.LogEmitted += log => Console.WriteLine(log.log);
    }
}

内容的提问来源于stack exchange,提问作者Pixelated Lagg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:06