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
相关产品推荐
相关产品推荐

