學習java事件前,回顧了下vb6和vb.net的事件機制,總結在這裏,供對比用。java
事件是面對對象中對象間通訊的方法。事件發生者(又叫事件源)發生一個事件時,經過發送一條消息,給事件接受者(事件處理者),事件接受者能夠作出響應的處理。好比在某登陸界面中,單擊一個按鈕,系統會驗證用戶的用戶名和密碼是否正確。用戶單擊按鈕後,按鈕(事件源)發出了單擊事件,產生了本身被單擊的消息給窗體,窗體(事件接受者)在自身代碼窗口中進行響應的處理。學習
咱們分別看下在vb和vb.net中是怎麼實現事件機制的。優化
在vb6中,使用Event關鍵字定義事件,raiseEvent發出事件消息,在接受者的類中使用WithEvent代表本身是某個類的事件的接受者,咱們看這樣兩段代碼:spa
首先創建一個窗體,是一個登陸窗體,輸入用戶名和密碼後,點擊登錄按鈕能夠登錄,代碼(vb6)以下,使用了WithEvent來接收驗證類(verifyClass)的消息:.net
Option Explicit '本句代碼代表該窗體能接受驗證類的事件消息 Private WithEvents vfClass As VerifyClass Private Sub cmdLogin_Click() '定義用戶名和密碼 Dim userName As String Dim password As String '定義返回結果 Dim Result As Boolean Set vfClass = New VerifyClass userName = txtUserName.Text password = txtPassword.Text '將用戶名和密碼傳到驗證類進行驗證 Result = vfClass.Verify(userName, password) End Sub Private Sub Form_Load() End Sub '引起驗證失敗事件後,在此處能夠進行相應處理 Private Sub vfClass_loginFail(ByVal userName As String) MsgBox (userName + "登陸失敗") End Sub '驗證成功事件 Private Sub vfClass_LoginSuccess(ByVal userName As String) MsgBox (userName + "登陸成功") End Sub
接下來添加一個類模塊,是登錄窗體中用到的驗證類(verifyClass)的代碼,裏面定義(Event)了並引起(raiseEvent)了事件:code
Option Explicit '定義驗證成功和失敗的事件 Public Event LoginSuccess(ByVal userName As String) Public Event loginFail(ByVal userName As String) '驗證方法:對用戶名和密碼進行驗證 Public Function Verify(ByVal userName As String, ByVal password As String) As Boolean Dim blnResult As Boolean If userName = "123" And password = "123" Then '若是正確,發出登錄成功的消息 RaiseEvent LoginSuccess(userName) blnResult = True Else '錯誤則發出登錄失敗的消息 RaiseEvent loginFail(userName) blnResult = False End If Verify = blnResult End Function
在vb.net中事件的實現機制同vb基本相同,而且有了優化,經過Handles關鍵字,使事件實現的機制更靈活,handles可使多個事件到同一個事件處理程序:orm
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button3.Click System.Windows.Forms.MessageBox.Show("我被觸發了") End Sub
也能夠經過AddHandler動態的綁定事件處理程序,便可以根據當時的條件選擇將要綁定的事件處理程序,看下面這個例子。對象
首先定義一個person類,有走路這個事件,在走路方法中觸發走路事件事件
Public Class Person Public Event walked(ByVal Distance As Integer) Public Sub walk(ByVal Distance As Integer) RaiseEvent walked(Distance) End Sub End Class
接下來新建一個窗體類,窗體上有一個文本框和一個按鈕,代碼以下ci
Public Class Form1 '本句代碼代表該窗體能接受驗證類的事件消息 Public WithEvents objPerson As Person Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click objPerson = New Person() '知足條件下才執行綁定操做 If (TextBox1.Text = "1") Then '知足條件,執行動態綁定,將事件綁定到某方法,該方法轉變成事件處理程序 AddHandler objPerson.walked, AddressOf Person_walk objPerson.walk(50) Else System.Windows.Forms.MessageBox.Show("您輸入的文本不是1") End If End Sub '觸發的事件將綁定到本事件處理程序 Public Sub Person_walk(ByVal Distance As Integer) System.Windows.Forms.MessageBox.Show("a person walked" + Distance.ToString() + " kilometer!") End Sub End Class
這就是vb和vb.net的事件處理機制,等學了java事件機制後將進行對比。