前提
您應該非常了解繼承和面向對象的編程有關詳細信息請參閱 Polymorphism in Components(英文)
繼承的事件處理程序
在繼承某個組件時該組件的所有成員都被並入新類中事件處理程序是在響應組件接收的特定事件時執行的方法並且它是和其他組件成員一同被繼承的以下示例顯示了一個典型的事件處理程序
Private Sub Button_Click(ByVal sender As SystemObject ByVal e as _
SystemEventArgs) Handles ButtonClick
Static Counter as Integer =
Counter +=
MessageBoxShow ( 此按鈕已被單擊 & _
CounterToString() & 次)
End Sub
只要發生 ButtonClick 事件就會執行以上方法方法聲明末尾的 Handles 子句將方法與事件進行關聯這是組件中事件處理程序的典型結構
為了在繼承類中重載此方法必須添加 Overridable 關鍵字並將訪問級別更改為 ProtectedProtected Friend 或 Public以下示例顯示了一個可以被重載的事件處理程序
Protected Overridable Sub Button_Click(ByVal sender As SystemObject _
ByVal e as SystemEventArgs) Handles ButtonClick
Static Counter as Integer =
Counter +=
MessageBoxShow ( 此按鈕已被單擊 & _
CounterToString() & 次)
End Sub
組件中繼承的事件處理程序
重載繼承的事件處理程序與重載任何其他類型的繼承方法基本相同唯一不同之處在於在重載繼承的事件處理程序時必須刪除 Handles 子句
重載繼承組件中的方法
將 Overrides 關鍵字添加到方法聲明中
注意不要在方法中添加 Handles 子句事件處理程序已經與基類中的事件相關聯並且此關聯將傳遞到繼承類中也就是說當引發事件時將執行此方法而不再需要額外的 Handles 子句
以下示例顯示了如何重載前面示例中的事件處理程序
Protected Overrides Sub Button_Click(ByVal sender As SystemObject _
ByVal e as SystemEventArgs)
Static Counter as Integer =
Counter +=
MessageBoxShow ( 此繼承的按鈕已被單擊 & _
CounterToString() & 次)
End Sub
為什麼不需要 Handles 子句
Handles 子句不再與此方法相關聯這並不是疏忽而是 NET 框架處理事件的一項重要內容事件處理程序已經與基類中的事件相關聯並且此關聯將傳遞到繼承類中也就是說當引發事件時將執行此方法而不再需要額外的 Handles 子句如下所示如果添加 Handles 子句將創建與事件的附加關聯這會使方法在每個事件中被執行兩次
不正確的代碼
Protected Overrides Sub Button_Click(ByVal sender As SystemObject _
ByVal e as SystemEventArgs) Handles ButtonClick
Static Counter as Integer =
每次單擊按鈕時此變量將遞增
兩次
Counter +=
每次單擊按鈕時消息框將顯示
兩次並顯示不准確的信息
MessageBoxShow ( 此繼承的按鈕已被單擊 & _
CounterToString() & 次)
End Sub
總結
重載事件處理程序可能造成一些不易察覺的問題並導致難以查出的錯誤因此設置與事件處理程序的正確關聯是非常重要的請小心使用並注意已經存在的事件關聯
From:http://tw.wingwit.com/Article/program/net/201311/11642.html