覆盖虚方法还是创建事件处理程序?

时间:2011-10-17 18:47:36

标签: c# events coding-style virtual

只是在查看Game class的XNA文档,并注意到有一个Deactivated事件和一个可以覆盖的OnDeactived虚拟方法。

Deactivated事件创建事件处理程序并覆盖OnDeactived虚拟方法都允许客户端处理失去焦点的游戏。

我想知道应该采用哪种方法来处理失去焦点的游戏。创建事件处理程序或覆盖虚拟方法?每种方法之间是否有任何差异?

2 个答案:

答案 0 :(得分:9)

有两个明显的区别:

  • 您只能覆盖从声明它的类派生的类中的OnDeactivated - 仅仅“其他”代码只能使用该事件
  • OnDeactived内,您可以自行决定是否致电base.OnDeactivated - 您可以有效地压制事件或更改参数;在您自己的代码之前或之后调用它等。

如果您已经从课程中获得,那么无论哪种方式都可行 - 我个人可能会经常使用该事件,除非我想采取任何其他类型的行动只能通过覆盖来执行。除了其他任何东西之外,如果您想将代码移动到其他任何位置,这会使代码更具可移植性。然而,无论如何,我通常不是继承的粉丝,所以我有偏见:)

答案 1 :(得分:2)

是否覆盖方法或使用事件处理程序的决定通常取决于您需要对执行该方法期间发生的事情进行多少控制。重写该方法可以完全控制该方法,而事件处理程序仅在方法执行后运行。

如果您需要对该方法中发生的事情进行高级别的控制,我建议覆盖该方法。如果您只需要在执行该方法后运行一些代码,我将使用事件处理程序。

protected override void OnDeactivated(EventArgs e)
{
    //run some code before execution (anything that could effect execution)

    //call the base method and fire the event
    base.OnDeactivated(e);

   //run some code after execution
}