C# Override method with subclass parameter

倾然丶 夕夏残阳落幕 提交于 2019-12-21 09:37:29

问题


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. 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. 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


回答1:


I've used your approach before.

It looks pretty solid to me.




回答2:


MyEvent change the abstract method Dispatch's signature. 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);
    }
}



回答3:


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.



来源:https://stackoverflow.com/questions/12593082/c-sharp-override-method-with-subclass-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!