带子类参数的C#覆盖方法

我正在努力实现这样的目标

public abstract class BaseEvent { public abstract void Dispatch(IEventHandler handler); } public class MyEvent : BaseEvent { public override void Dispatch(IMyEventHandler handler) { handler.OnMyEvent(this); } } public interface IEventHandler { } public interface IMyEventHandler : IEventHandler { void OnMyEvent(MyEvent e); } 

问题是编译器抱怨说MyEvent没有实现BaseEvent因为Dispatch正在使用IMyEventHandler而不是IEventHandler 。 我不想让MyEvent.Dispatch接受一个IEventHandler然后将它转换为IMyEventHandler因为我想编译时间检查以确保我没有像传递其他类型的事件处理程序那样做一些愚蠢的事情。 我找到了一个可能的解决方案(下面),但我想知道是否有更好的方法来做到这一点。

 public abstract class BaseEvent where H : IEventHandler { public abstract void Dispatch(H handler); } public class MyFirstEvent : BaseEvent where H : IMyFirstEventHandler { public override void Dispatch(H handler) { handler.OnMyFirstEvent(this); } } public interface IEventHandler { } public interface IMyFirstEventHandler : IEventHandler { void OnMyFirstEvent(MyFirstEvent e) where H : IMyFirstEventHandler; } 

谢谢,汤姆

我以前用过你的方法。

它看起来非常坚固。

MyEvent改变了抽象方法Dispatch的签名。 所以你得到一个编译时错误。

如何遵循代码。

 public class MyEvent : BaseEvent { public override void Dispatch(IEventHandler handler) { if(!handler is IMyFirstEventHandler )throw new ArgumentException("message"). ((IMyFirstEventHandler )handler).OnMyEvent(this); } } 

这似乎与帮助覆盖和inheritance非常相似。 如果你想覆盖一个方法,我非常有信心你需要关键字’virtual’。