具有子类参数的C#覆盖方法 [英] C# Override method with subclass parameter

查看:81
本文介绍了具有子类参数的C#覆盖方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

问题是编译器抱怨说MyEvent没有实现BaseEvent,因为Dispatch使用的是IMyEventHandler而不是IEventHandler.我不想让MyEvent.Dispatch接受IEventHandler然后将其强制转换为IMyEventHandler,因为我想编译时间检查以确保我没有做像传递其他类型的事件处理程序那样的愚蠢行为.我找到了一个可能的解决方案(如下),但我想知道是否有更好的方法可以做到这一点.

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

谢谢汤姆

推荐答案

我以前使用过您的方法.

I've used your approach before.

对我来说看起来很扎实.

It looks pretty solid to me.

这篇关于具有子类参数的C#覆盖方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆