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

问题描述:

当谈到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) 

我也衍生事件类为例DerivedEventBaseEvent继承并增加自己的属性/顶部的字段。

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

AddEventListener("my_event", MyEventHandler); 

和我的处理程序方法会是这个样子:

void MyEventHandler(BaseEvent evt) 

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

void MyEventHandler(DerivedEvent evt) 

我通过接口甚至尝试但并没有区别。我目前的方法体中铸造实际事件类:

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

是真正的唯一途径?希望有人能赐教:)

当委托调用调用者允许任何BaseEvent通过。它不一定是DerivedEvent。由于调用者可能传入的对象不是DerivedEvent,因此您的处理程序不能认为传入的值是DerivedEvent

可以做的是添加一个处理程序,不仅可以接受任何BaseEvent,但也可以接受其他事情。例如,您可以添加一个接受object作为参数的处理程序,因为处理程序调用时传入的任何BaseEvent将是将是object

+0

我不太关注。如果我进一步下去兔子洞,我仍然会留下铸造实际的类,事件是从没有? –

+0

@SandroDucceschi如果调用委托的代码实际上将提供'DerivedEvent',那么* that *应该是委托中的参数。如果不是,那么你就没有办法做,因为这个参数实际上并不是一个“DerivedEvent”。铸造只是让它在运行时失败而不是编译时。 – Servy

+0

好,这个想法是有一个系统,我可以从'BaseEvent'传递任何派生类,然后调用适当的处理程序,期望所述派生类作为参数。像这样: 'AddEventListener(DerivedEvent.AN_EVENT,DerivedEventHandler); void DerivedEventHandler(DerivedEvent evt);' 但我希望通过定义BaseEvent作为委托的参数,这将适用于任何此类使用。是的,如果参数是其他类型的派生事件类,它显然会失败。这是可以和预期的。 –