当在派生类中重写OnInit方法时,如果不使用MyBase.OnInit(e),会有什么影响?

5

我正在继承自TextBox并重写OnInit方法。

Protected Overrides Sub OnInit(e As EventArgs)

MyBase.OnInit(e) 

' I'm adding a dynamic control to go along with my textbox here...
Controls.Add(Something)

End Sub

在上面的示例中,我有MyBase.OnInit(e),但我已经使用我的控件一段时间了,因为我忘记在其中放置它。这是我通常出于习惯而做的事情,所以我从来没有考虑过它的目的:

在派生类中覆盖OnInit时,请确保调用基类的OnInit方法,以便注册的委托接收事件。

有点尴尬,我不清楚这对我有何意义,但我的控件运行良好,所以我希望有人能举例说明可能会引起问题的情况。

我想象它会破坏监听OnInit事件的代码。 - Rob
1个回答

4

浏览参考源代码 for TextBox,如果你沿着继承链一直追溯到Control,你会发现这是OnInit的基本代码:

protected internal virtual void OnInit(EventArgs e) {
    if(HasEvents()) {
        EventHandler handler = _events[EventInit] as EventHandler;
        if(handler != null) {
            handler(this, e);
        }
    }
}

所以如果您不调用 base.OnInit,将会错过这些内容。

我理解了基本概念,但不确定是哪种“事件”会引起问题。例如,OnTextChange是一个事件,但您也会调用基础的OnTextChange。或者,如果我在类定义中添加处理程序(我也这样做了),它也没有任何问题,即使我忘记调用MyBase.OnInit(e)。所以我知道你的答案是正确的,但我显然还没有完全理解它。 - user1447679
我想重点是还有其他东西在监听这些事件。如果你错过了基础调用,那么奇怪的事情可能会发生。所以除非你确切地知道自己在做什么,否则我总是会把它们放在那里。 - DavidG
完全同意,直到我忘记把它放进去,一个月后才注意到,我才想知道为什么一切都好。所以现在我正在努力消化微软的另一个复杂部分。似乎这永无止境。 - user1447679

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接