萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> .net編程 >> VB.NET Override處理方式解讀

VB.NET Override處理方式解讀

class="area">

在學習了VB.NET這門編程語言後,大家會慢慢的發現這門語言中隱藏的知識是很廣的,有很多功能值得我們去深入的研究。比如VB.NET Override就是其中一個比較難掌握的知識點。在類或控件的繼承中,子類或子控件封裝了父類的所有函數,其中包括事件處理程序。本文將著重討論事件處理程序的VB.NET Override實現方法。

繼承事件處理程序

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

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

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

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

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

在組件中繼承事件處理程序

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

如何 override 組件的事件處理程序

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

請注意:不要附加 Handles 子句。因為父類的處理程序已經關聯了特定事件,子類將繼承這一切。換句話說,父類所關聯的事件可以激活子類的處理程序,因而這裡的 Handles 子句是多余的。

下面示范如何 override 前述事件處理程序:

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

2) 為什麼不需要 Handles 子句

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

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

結論

在 Visual Basic .NET 中,事件處理程序的VB.NET Override可能造成難以偵錯的 bug 。例如在使用 Handles 子句關聯事件處理程序時就要格外小心,以免發生重復關聯。


copyright © 萬盛學電腦網 all rights reserved