2016-04-18 68 views
4

我從TextBox繼承並重寫OnInit。在派生類中重寫它時,不使用MyBase.OnInit(e)會有什麼影響?

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方法,以便已註冊的委託接收該事件。

有點尷尬,我不清楚這一點,但我的控制工作正常,所以我只是希望有人能舉一個例子來說明可能產生問題的例子。

+0

我會想象它會破壞正在偵聽'OnInit'事件的代碼 – Rob

回答

4

縱觀reference source codeTextBox,如果你遵循繼承高達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,這就是會錯過了。

+0

正確。我在基本層面理解這一點,但不確定哪種類型的「事件」會導致問題。例如,OnTextChange是一個事件,但您也可以調用基礎OnTextChange。或者,如果我在我的類定義中添加了一個處理程序(我也是這樣),即使我忘記調用MyBase.OnInit(e),它也沒有問題。所以我知道你的答案是正確的,但我顯然不完全理解它。 – user1447679

+0

我想重點是還有其他的事情正在傾聽事件。如果你錯過了基本電話,那麼奇怪的事情*可能會發生。所以除非你明確知道你在做什麼,否則我總是會把它們放在那裏。 – DavidG

+0

絕對同意,直到我忘了放在那裏,一個月後才注意到,我想知道爲什麼一切都很好。所以現在我的任務是完全消化另一個微軟的複雜部分。似乎這是永無止境的。 – user1447679

相關問題