使用 visual basic .net 重載事件處理程序
matthew a. stoecker
visual studio team
microsoft corporation
2002 年 2 月
概要:本文介紹在 visual basic? .net 中編程時,如何重載事件處理程序。同時還討論如何使用 handles 子句。
目錄
簡介
前提
繼承的事件處理程序
組件中繼承的事件處理程序
總結(jié)
簡介
在繼承控件或組件時,將創(chuàng)建封裝基類的所有功能的新控件或新組件。基類定義的所有事件處理程序都包含在繼承的組件中。本文將分析與繼承的事件處理程序相關(guān)的問題,并具體討論如何使用 visual basic .net 開發(fā)應(yīng)用程序。
前提
您應(yīng)該非常了解繼承和面向?qū)ο蟮木幊獭S嘘P(guān)詳細(xì)信息,請參閱 polymorphism in components(英文)。
繼承的事件處理程序
在繼承某個組件時,該組件的所有成員都被并入新類中。事件處理程序是在響應(yīng)組件接收的特定事件時執(zhí)行的方法,并且它是和其他組件成員一同被繼承的。以下示例顯示了一個典型的事件處理程序:
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 (" 此按鈕已被單擊 " & _
counter.tostring() & " 次。")
end sub
只要發(fā)生 button1.click 事件,就會執(zhí)行以上方法。方法聲明末尾的 handles 子句將方法與事件進(jìn)行關(guān)聯(lián)。這是組件中事件處理程序的典型結(jié)構(gòu)。
為了在繼承類中重載此方法,必須添加 overridable 關(guān)鍵字,并將訪問級別更改為 protected、protected friend 或 public。以下示例顯示了一個可以被重載的事件處理程序:
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 (" 此按鈕已被單擊 " & _
counter.tostring() & " 次。")
end sub
組件中繼承的事件處理程序
重載繼承的事件處理程序與重載任何其他類型的繼承方法基本相同,唯一不同之處在于:在重載繼承的事件處理程序時,必須刪除 handles 子句。
重載繼承組件中的方法
將 overrides 關(guān)鍵字添加到方法聲明中。
注意:不要在方法中添加 handles 子句。事件處理程序已經(jīng)與基類中的事件相關(guān)聯(lián),并且此關(guān)聯(lián)將傳遞到繼承類中。也就是說,當(dāng)引發(fā)事件時將執(zhí)行此方法,而不再需要額外的 handles 子句。
以下示例顯示了如何重載前面示例中的事件處理程序:
protected overrides sub button1_click(byval sender as system.object, _
byval e as system.eventargs)
static counter as integer = 0
counter += 1
messagebox.show (" 此繼承的按鈕已被單擊 " & _
counter.tostring() & " 次。")
end sub
為什么不需要 handles 子句
handles 子句不再與此方法相關(guān)聯(lián)。這并不是疏忽,而是 .net 框架處理事件的一項重要內(nèi)容。事件處理程序已經(jīng)與基類中的事件相關(guān)聯(lián),并且此關(guān)聯(lián)將傳遞到繼承類中。也就是說,當(dāng)引發(fā)事件時將執(zhí)行此方法,而不再需要額外的 handles 子句。如下所示,如果添加 handles 子句,將創(chuàng)建與事件的附加關(guān)聯(lián),這會使方法在每個事件中被執(zhí)行兩次。
' 不正確的代碼
protected overrides sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
static counter as integer = 0
' 每次單擊按鈕時,此變量將遞增
' 兩次。
counter += 1
' 每次單擊按鈕時,消息框?qū)@示
' 兩次,并顯示不準(zhǔn)確的信息。
messagebox.show (" 此繼承的按鈕已被單擊 " & _
counter.tostring() & " 次。")
end sub
總結(jié)
重載事件處理程序可能造成一些不易察覺的問題,并導(dǎo)致難以查出的錯誤。因此,設(shè)置與事件處理程序的正確關(guān)聯(lián)是非常重要的。請小心使用,并注意已經(jīng)存在的事件關(guān)聯(lián)。
新聞熱點(diǎn)
疑難解答
圖片精選