9

我正在尝试实现这样的目标

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它使用的是 anIMyEventHandler而不是IEventHandler. 我不想让MyEvent.DispatchaIEventHandler然后将其转换为 a 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;
}

谢谢,汤姆

4

3 回答 3

8

我以前用过你的方法。

对我来说它看起来很坚固。

于 2012-09-26T00:50:15.123 回答
-3

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

跟随代码怎么样。

public class MyEvent : BaseEvent
{
    public override void Dispatch(IEventHandler handler)
    {
        if(!handler is IMyFirstEventHandler )throw new ArgumentException("message").
        ((IMyFirstEventHandler )handler).OnMyEvent(this);
    }
}
于 2012-09-26T00:52:48.190 回答
-4

这似乎与Help With Overriding and Inheritance非常相似。如果你想重写一个方法,我很有信心你需要关键字'virtual'。

于 2012-09-26T01:11:22.080 回答