委托参数 - 基类/派生类冲突

  • 本文关键字:派生 冲突 基类 参数 c#
  • 更新时间 :
  • 英文 :


当涉及到C#时,我有点菜鸟,这就是为什么我来找你们希望得到一些澄清。我有一个定义委托的 EventDispatcher 类:

delegate void EventHandler(BaseEvent evt);

以及一些使用它的方法:

void AddEventListener(string event_name, EventHandler handler)
void RemoveEventListener(string event_name, EventHandler handler = null)
void DispatchEvent(BaseEvent evt)

我还派生了事件类,例如从BaseEvent继承并在顶部添加自己的属性/字段的 DerivedEvent

正如预期的那样,我会像这样使用它:

AddEventListener("my_event", MyEventHandler);

我的处理程序方法看起来像这样:

void MyEventHandler(BaseEvent evt)

最后,实际问题。为什么我不能定义一个使用派生事件类作为参数的处理程序,如下所示:

void MyEventHandler(DerivedEvent evt)

我甚至尝试过通过接口,但这没有区别。我目前正在方法主体内转换为实际的事件类:

...
DerivedEvent actualEvent = (DerivedEvent)evt;
...

这真的是唯一的方法吗?希望有人能启发我:)

当调用委托时,允许调用方传入任何BaseEvent。 不一定是DerivedEvent. 由于调用方可能传入的对象不是DerivedEvent,因此您的处理程序不能假定传入的值是DerivedEvent

您可以做的是添加一个处理程序,该处理程序不仅可以接受任何BaseEvent,还可以接受其他内容。 例如,您可以添加一个接受object作为参数的处理程序,因为在调用处理程序时传入的任何BaseEvent都将object

最新更新