为什么自动插入事件处理程序会有所不同,具体取决于它们是如何创建的?

时间:2014-01-23 14:52:15

标签: vb.net winforms event-handling

我注意到我正在处理的应用程序中的表单事件处理程序有不同的对象引用:其中一些是Me.<event>,其中一些是MyBase.<event>。经过一段时间的游戏,我发现从设计器中的属性窗口创建的事件被赋予了MyBase引用,而通过在代码窗口中选择它们而创建的事件被赋予了Me引用。

read up关于这两个参考文献之间的差异,但这并没有真正阐明为什么在这些情况下可以使用一个而不是另一个。那么,我应该关注具有不同引用的表单事件处理程序吗?如果是这样,我应该使用哪一个

1 个答案:

答案 0 :(得分:3)

MeMyBase确实有不同的含义,但当您谈论事件处理程序时,它们可以互换使用。

当您想引用基类中的成员时,使用

MyBase。当您的派生类Overrides来自您的基类的某个成员,但是您希望专门调用该成员的基类实现而不是您自己的成员时,这非常有用。例如:

Public Class MyBaseClass
    Public Overridable Sub DoWork()
        Console.WriteLine("Base")
    End Sub
End Class

Public Class MyDerivedClass
    Inherits MyBaseClass

    Public Overrides Sub DoWork()
        Console.WriteLine("Derived")
    End Sub

    Public Sub Test()
        Me.DoWork()
        MyBase.DoWork()
    End Sub
End Class

调用MyDerivedClass.Test方法时,上面的示例将输出以下内容:

Derived
Base

很明显,MeMyBase意味着两件不同的事情。但是,当涉及到事件时,在VB.NET中,没有办法让派生类覆盖由其基类定义的事件。实际上,派生类也无法对事件进行阴影处理。如果基类定义了一个事件,那么从它派生的所有类必须具有与基类中定义的完全相同的事件。

由于是这种情况,当您在派生类中定义事件处理程序时,无论您是说Handles Me.MyEvent还是Handles MyBase.MyEvent都无关紧要。两个类中的事件必须相同,因此区别是没有意义的。我想你可以说使用MyBase更具有特定的,但我认为大多数人会同意,在可能的情况下,总是使用MyBase的清晰度会增加代码将是微不足道的。