简体   繁体   English

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

[英]C# Override method with subclass parameter

I'm trying to achieve something like this 我正在努力实现这样的目标

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);
}

The problem is that the compiler complains saying that MyEvent doesn't implement BaseEvent since Dispatch is taking an IMyEventHandler instead of an IEventHandler . 问题是编译器抱怨说MyEvent没有实现BaseEvent因为Dispatch正在使用IMyEventHandler而不是IEventHandler I don't want to let MyEvent.Dispatch take a IEventHandler then cast it to a IMyEventHandler because I would like compile time checks to make sure I'm not doing something stupid like passing in some other type of event handler. 我不想让MyEvent.Dispatch接受一个IEventHandler然后将它转换为IMyEventHandler因为我想编译时间检查以确保我没有像传递其他类型的事件处理程序那样做一些愚蠢的事情。 I found a possible solution (below) but I'm wondering if there is a nicer way of doing this. 我找到了一个可能的解决方案(下面),但我想知道是否有更好的方法来做到这一点。

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;
}

Thanks, Tom 谢谢,汤姆

I've used your approach before. 我以前用过你的方法。

It looks pretty solid to me. 它看起来非常坚固。

MyEvent change the abstract method Dispatch's signature. MyEvent改变了抽象方法Dispatch的签名。 so you got a compile time error. 所以你得到一个编译时错误。

how about follow code. 如何遵循代码。

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

This seems pretty similar to Help With Overriding and Inheritance . 这似乎与帮助覆盖和继承非常相似。 I'm pretty confident you need to the keyword 'virtual' if you want to override a method. 如果你想覆盖一个方法,我非常有信心你需要关键字'virtual'。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM