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

时间:2012-09-26 00:45:11

标签: c# override 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);
}

问题是编译器抱怨说MyEvent没有实现BaseEvent,因为Dispatch正在使用IMyEventHandler而不是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;
}

谢谢,汤姆

3 个答案:

答案 0 :(得分:7)

我之前使用过您的方法。

对我来说看起来非常可靠。

答案 1 :(得分:-2)

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

如何关注代码。

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

答案 2 :(得分:-3)

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