我有类似的东西
class Super{
public event EventHandler MyEvent;
public void Enable(){
MyEvent+=AtEvent;
}
public void Disable(){
MyEvent-=AtEvent;
}
protected void AtEvent(object sender,EventArgs e){
AllThatJazz();
}
}
class Child:Super{
protected new void AtEvent(object sender,EventArgs e){
try{
base.AtEvent(sender,e);
}catch(ObjectDisposedException){}
}
}
class Program{
public static void Main(){
Child c = new Child();
c.Enable();
}
}
c.Enable()将基类的事件处理程序附加到MyEvent,而不是Child的新AtEvent方法。有人可以解释一下吗? 我很欣赏有关替代方案的建议,但请注意,Super是在一个单独的组件中。
答案 0 :(得分:1)
AtEvent
不是虚拟的,它是密封的。您正在从基类中的方法调用它,因此它将静态绑定到该方法的特定实现。它需要是虚拟的(并且被覆盖而不是被遮蔽)来调用该方法的最派生的实现,或者需要从对Child
静态类型的对象的引用中调用它,这是目前在您致电AtEvent
的地方并非如此。