VB.NET的Override事件處理常式

來源:互聯網
上載者:User
程式 VB.NET的Override事件處理常式

介紹
在類或控制項的繼承中,子類或子控制項封裝了父類的所有函數,其中包括事件處理常式。本文將著重討論在 Visual Basic .NET 應用程式設計中如何正確對待事件處理常式的繼承。

讀者要求
本文假定讀者熟悉物件導向程式設計和類的繼承性。若您尚未熟悉它們,請參閱《組件的多態性》 ("Polymorphism in Components")。

繼承事件處理常式
當組件被繼承時,它的所有成員都被封裝到子類中。事件處理常式是響應特定事件的方法,是組件成員之一,因而也被繼承。請看一個典型的事件處理常式:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e as _
System.EventArgs) Handles Button1.Click
Static Counter as Integer = 0
Counter += 1
MessageBox.Show (" This button has been clicked " & _
Counter.ToString() & " times.")
End Sub

我們看到,宣告部分末尾的 Handles 子句把處理常式關聯到特定的事件上。具體而言,上述代碼將在 Button1.Click 事件發生時運行。這就是用於定義事件處理常式的典型文法。

為了實現 override ,你必須使用 Overridable 關鍵字,並且重新定義其可見度為 Protected 、 Protected Friend 或者 Public 。下面示範如何 override 事件處理程式:

Protected Overridable Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs) Handles Button1.Click
Static Counter as Integer = 0
Counter += 1
MessageBox.Show (" This button has been clicked " & _
Counter.ToString() & " times.")
End Sub

在組件中繼承事件處理常式

事件處理常式的 override 固然與其它方法的 override 大同小異,有一點卻不得不提:在 override 事件處理常式時必須除去 Handles 子句。

如何 override 組件的事件處理常式

1) 在事件處理常式的宣告部分加入 Overrides 關鍵字

請注意:不要附加 Handles 子句。因為父類的處理常式已經關聯了特定事件,子類將繼承這一切。換句話說,父類所關聯的事件可以啟用子類的處理常式,因而這裡的 Handles 子句是多餘的。
下面示範如何 override 前述事件處理常式:

Protected Overrides Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs)
Static Counter as Integer = 0
Counter += 1
MessageBox.Show (" This inherited button has been clicked " & _
Counter.ToString() & " times.")
End Sub

2) 為什麼不需要 Handles 子句

前面提到,我們沒有使用關聯事件的 Handles 子句並不是一個疏漏,而是由 .NET 架構的事件處理機制所決定的。父類中的 Handles 子句將事件處理常式關聯到特定事件上,這種關聯將被子類繼承。因此,即令子類中沒有 Handles 子句,父類所關聯的事件也能啟用子類的事件處理常式。倘若此時加上 Handles 子句,則處理常式將被再次關聯到事件上。重複關聯的後果是處理常式將被連續啟用兩次。例如:

' 錯誤的代碼
Protected Overrides Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs) Handles Button1.Click
Static Counter as Integer = 0
' 本例中使用了 Handles 子句,
' 因而每當按鈕 Button1 被點擊一次,
' 變數 Counter 將會增加兩次 ;
Counter += 1
' 訊息框也會彈出兩次,
' 顯示的內容也將違背設計意圖
MessageBox.Show (" This inherited button has been clicked " & _
Counter.ToString() & " times.")
End Sub

結論
在 Visual Basic .NET 中,事件處理常式的 override 可能造成難以偵錯的 bug 。例如在使用 Handles 子句關聯事件處理常式時就要格外小心,以免發生重複關聯。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。