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

tle*_*eef 8 c# overriding subclass

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

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);
}
Run Code Online (Sandbox Code Playgroud)

问题是编译器抱怨说MyEvent没有实现,BaseEvent因为DispatchIMyEventHandler取而代之的是IEventHandler.我不想让MyEvent.Dispatch一个IEventHandler然后把它投射到一个IMyEventHandler因为我想编译时间检查以确保我没有做一些愚蠢的事情,如传递其他类型的事件处理程序.我找到了一个可能的解决方案(下面),但我想知道是否有更好的方法来做到这一点.

public abstract class BaseEvent<H> where H : IEventHandler
{
    public abstract void Dispatch(H handler);
}

public class MyFirstEvent<H> : BaseEvent<H> where H : IMyFirstEventHandler
{
    public override void Dispatch(H handler)
    {
        handler.OnMyFirstEvent(this);
    }
}

public interface IEventHandler
{
}

public interface IMyFirstEventHandler : IEventHandler
{
    void OnMyFirstEvent<H>(MyFirstEvent<H> e) where H : IMyFirstEventHandler;
}
Run Code Online (Sandbox Code Playgroud)

谢谢,汤姆

Jim*_* G. 8

我以前用过你的方法.

它看起来非常坚固.