C# 委托参数-基类/派生类冲突
说到C#,我有点不知所措,这就是为什么我来到你们这里希望得到一些澄清。我有一个EventDispatcher类,它定义了一个委托:C# 委托参数-基类/派生类冲突,c#,C#,说到C#,我有点不知所措,这就是为什么我来到你们这里希望得到一些澄清。我有一个EventDispatcher类,它定义了一个委托: delegate void EventHandler(BaseEvent evt); 以及一些使用它的方法: void AddEventListener(string event_name, EventHandler handler) void RemoveEventListener(string event_name, EventHandler handler
delegate void EventHandler(BaseEvent evt);
以及一些使用它的方法:
void AddEventListener(string event_name, EventHandler handler)
void RemoveEventListener(string event_name, EventHandler handler = null)
void DispatchEvent(BaseEvent evt)
我还有派生的事件类,例如DerivedEvent
,它继承自BaseEvent
,并在顶部添加它们自己的属性/字段
正如所料,我会这样使用它:
AddEventListener("my_event", MyEventHandler);
我的Handler方法如下所示:
void MyEventHandler(BaseEvent evt)
最后是实际问题。为什么我不能定义一个使用派生事件类作为参数的处理程序,如下所示:
void MyEventHandler(DerivedEvent evt)
我甚至尝试过通过接口,但没有什么不同。我目前正在方法体中对实际事件类进行强制转换:
...
DerivedEvent actualEvent = (DerivedEvent)evt;
...
这真的是唯一的办法吗?希望有人能告诉我:)当调用代理时,允许调用方传入任何
BaseEvent
。它不一定是衍生事件
。由于调用方可能传入的对象不是DerivedEvent
,因此处理程序不能假定传入的值是DerivedEvent
您可以做的是添加一个处理程序,它不仅可以接受任何
BaseEvent
,还可以接受其他内容。例如,您可以添加一个接受object
作为参数的处理程序,因为调用处理程序时传入的任何BaseEvent
都将是对象
我不太明白。如果我进一步深入兔子洞,我仍然会将其转换为事件来自的实际类no?@SandroDucceschi如果调用委托的代码实际上将提供一个DerivedEvent
,那么该参数应该是委托中的参数。如果不是,那么您就无能为力,因为该参数实际上不是一个DerivedEvent
。强制转换只是让它在运行时而不是编译时失败。好吧,我们的想法是建立一个系统,在这个系统中,我可以从BaseEvent
传递任何派生类,然后调用相应的处理程序,该处理程序将所述派生类作为参数。如下所示:AddEventListener(DerivedEvent.AN_事件,DerivedEventHandler);作废DerivedEventHandler(DerivedEvent evt)然而,我希望通过将BaseEvent定义为委托的参数,这将适用于任何此类用途。是的,如果参数是任何其他类型的派生事件类,它显然会失败。这是可以预期的。@SandroDucceschi和我已经向您解释了为什么不可以,因为处理程序不一定总是被赋予比BaseEvent
更具体的对象类型;这是它对调用方的最大假设。明白了!:)很抱歉这么固执:)。有没有其他方法可以实现我的目标?或者这只是我不得不忍受的一个限制?