覆盖虚拟方法或创建事件处理程序

本文关键字:事件处理 程序 创建 虚拟 方法 覆盖 | 更新日期: 2023-09-27 18:11:35

我只是在看Game类的XNA文档,注意到有一个Deactivated事件和一个OnDeactived虚拟方法可以重写。

Deactivated事件创建事件处理程序和重写OnDeactived虚拟方法允许客户端处理游戏失去焦点。

我想知道应该使用哪种方法来处理游戏失去焦点的问题。创建事件处理程序还是覆盖虚拟方法?每种方法之间有什么区别吗?

覆盖虚拟方法或创建事件处理程序

有两个明显的区别:

  • 您只能在声明它的类派生的类中重写OnDeactivated -仅仅"其他"代码只能使用事件
  • OnDeactived中,由您决定是否调用base.OnDeactivated -您可以有效地抑制事件,或更改参数;在自己的代码之前或之后调用它,等等。

如果你已经从类中派生,任何一种方式都可以——我个人可能会更频繁地使用事件,除非我想采取任何其他类型的操作,这些操作只能通过重写来执行。除此之外,如果您想将代码移动到其他任何地方,这使得代码更具可移植性。不过话说回来,我通常不是继承的粉丝,所以我有偏见:)

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

如果您需要对该方法期间发生的事情进行高级控制,我建议重写该方法。如果您只是需要在方法执行后运行一些代码,我会使用事件处理程序。

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
}