c#不会在基类中使用新的重写方法

时间:2014-07-01 15:53:46

标签: c# events inheritance override

我有类似的东西

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是在一个单独的组件中。

1 个答案:

答案 0 :(得分:1)

AtEvent不是虚拟的,它是密封的。您正在从基类中的方法调用它,因此它将静态绑定到该方法的特定实现。它需要是虚拟的(并且被覆盖而不是被遮蔽)来调用该方法的最派生的实现,或者需要从对Child静态类型的对象的引用中调用它,这是目前在您致电AtEvent的地方并非如此。