国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

VB.NET的Override事件處理程序

2024-07-10 13:02:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

vb.net的override事件處理程序

介紹
在類或控件的繼承中,子類或子控件封裝了父類的所有函數(shù),其中包括事件處理程序。本文將著重討論在 visual basic .net 應(yīng)用程序設(shè)計(jì)中如何正確對(duì)待事件處理程序的繼承。

讀者要求
本文假定讀者熟悉面向?qū)ο蟪绦蛟O(shè)計(jì)和類的繼承性。若您尚未熟悉它們,請(qǐng)參閱《組件的多態(tài)性》 ("polymorphism in components")。

繼承事件處理程序
當(dāng)組件被繼承時(shí),它的所有成員都被封裝到子類中。事件處理程序是響應(yīng)特定事件的方法,是組件成員之一,因而也被繼承。請(qǐng)看一個(gè)典型的事件處理程序:

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 子句把處理程序關(guān)聯(lián)到特定的事件上。具體而言,上述代碼將在 button1.click 事件發(fā)生時(shí)運(yùn)行。這就是用于定義事件處理程序的典型語(yǔ)法。

為了實(shí)現(xiàn) override ,你必須使用 overridable 關(guān)鍵字,并且重新定義其可見性為 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 大同小異,有一點(diǎn)卻不得不提:在 override 事件處理程序時(shí)必須除去 handles 子句。

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

1) 在事件處理程序的宣告部分加入 overrides 關(guān)鍵字

請(qǐng)注意:不要附加 handles 子句。因?yàn)楦割惖奶幚沓绦蛞呀?jīng)關(guān)聯(lián)了特定事件,子類將繼承這一切。換句話說(shuō),父類所關(guān)聯(lián)的事件可以激活子類的處理程序,因而這里的 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 子句

前面提到,我們沒(méi)有使用關(guān)聯(lián)事件的 handles 子句并不是一個(gè)疏漏,而是由 .net 框架的事件處理機(jī)制所決定的。父類中的 handles 子句將事件處理程序關(guān)聯(lián)到特定事件上,這種關(guān)聯(lián)將被子類繼承。因此,即令子類中沒(méi)有 handles 子句,父類所關(guān)聯(lián)的事件也能激活子類的事件處理程序。倘若此時(shí)加上 handles 子句,則處理程序?qū)⒈辉俅侮P(guān)聯(lián)到事件上。重復(fù)關(guān)聯(lián)的后果是處理程序?qū)⒈贿B續(xù)激活兩次。例如:

' 錯(cuò)誤的代碼
protected overrides sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
static counter as integer = 0
' 本例中使用了 handles 子句,
' 因而每當(dāng)按鈕 button1 被點(diǎn)擊一次,
' 變量 counter 將會(huì)增加兩次 ;
counter += 1
' 消息框也會(huì)彈出兩次,
' 顯示的內(nèi)容也將違背設(shè)計(jì)意圖
messagebox.show (" this inherited button has been clicked " & _
counter.tostring() & " times.")
end sub

結(jié)論
在 visual basic .net 中,事件處理程序的 override 可能造成難以偵錯(cuò)的 bug 。例如在使用 handles 子句關(guān)聯(lián)事件處理程序時(shí)就要格外小心,以免發(fā)生重復(fù)關(guān)聯(lián)。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 微山县| 云霄县| 泰顺县| 富平县| 芜湖市| 庄河市| 乐平市| 大连市| 松江区| 新田县| 玉溪市| 尉犁县| 千阳县| 江城| 新和县| 宜川县| 南召县| 新巴尔虎右旗| 东兴市| 通化市| 黔江区| 阿勒泰市| 万年县| 甘泉县| 米易县| 股票| 盘山县| 双城市| 崇明县| 六盘水市| 米泉市| 长垣县| 庄河市| 安陆市| 通州市| 泸州市| 资溪县| 谷城县| 舒兰市| 财经| 凯里市|