按鈕事件之我見
作者:
jim
時間:
2006-6-21
:虛函式(
virtual
)、覆蓋(
override
)、事件(
event
)、**(
delegate)
引言:在物件導向的程式設計中,主要涉及到的關鍵知識點就是以上列出的幾個,在學習過程中,往往是分散開來學習,可能會出現學前忘後的現象,本文主要通過
c#中對乙個按鈕(
button
)的繼承的例項說明,了解各自的用法和內部聯絡。由於本人知識有限,如若出現錯誤之處,還望各位大蝦指正。小弟在此先謝過。j
前言說明:相信各位在系統開發過程中,肯定使用過按鈕(
button
)。在使用過程中可能就是從工具箱中拖動乙個
button
到窗體中,在雙擊按鈕,自動編寫按鈕的
click
初步分析:當我們將乙個按鈕從工具箱中拖到我們的窗體中時,其實在窗體的
designer.cs
中則首先生成了一行此按鈕的引用:
private
system.windows.forms.button sysbtn;
sysbtn
是我的button
的名稱,請注意此時
sysbtn
的型別說明,後面說明中會涉及到。
當我們需要進行對該按鈕的單擊事件需要編碼時,我們只需要雙擊一下這個按鈕即可自動出現乙個函式供我們填寫。
private
void sysbtn_click(object sender, eventargs e)
其實在在窗體的
designer.cs
中,會自動生成事件的具體定義和說明
this
.sysbtn.click += new system.eventhandler(this.sysbtn_click);
現在對這一行文字進行解釋和說明:
首先是事件:
this.sysbtn.click
,我們知道
click
是button
乙個事件,他只是
button類中n
個事件中的乙個,但他們都具有相同的性質和用法,即:事件都是由定義事件的類自生觸發,並在類的外部實現具體的事件處理。
然後是**(delegate),**其實就是乙個指標函式,他規定了事件的原型定義,如**名稱、**引數,對於以上的
button
的click
事件的**已經由
c#編譯系統預定義了,就是
system.eventhandler
(eventargs e
),**其實起了乙個橋梁的作用,通過**,將類內部事件與類外部處理銜接起來。
最後是外部事件處理:
在本例中,外部處理即:
private
void sysbtn_click(object sender, eventargs e)
事件外部處理函式原型必須與**一致。此處單擊按鈕時,會顯示
"這是系統按鈕的事件委託
"訊息框。
深入分析:現在我們深入到
button
的內部,再次研究一下
click
事件的工作原理,通過前面的描述,我們了解到事件是在類內部觸發的,但是具體是什麼東西觸發了呢?
我們通過
msdn
幫助可了解到
button
類的所有成員的組成,會發現其中有個
protected
virtual void onclick( eventargs e)
函式,從函式名稱我們可以看出他與
click
事件有著必然的聯絡,其實,元凶就是他,是他觸發了
button
的click
事件,我們可以通過以下的例項進行驗證,下面我們來具體分析一下:
首先是虛函式(virtual),
虛函式的主要特點就是用來被繼承類覆蓋的,在後面的說明中,我們就會發現他的奧妙所在了。
然後我們通過繼承
button
類,生成我們自己的
button
類mybtn
class
mybtn :system.windows.forms.button
並在剛才的窗體中引用我們的
button
類,和事件定義以及實現函式
private
mybtn mybtn;
this
.mybtn.click += new system.eventhandler(this.mybtn_click);
private
void mybtn_click(object sender, eventargs e)
顯然,當單擊按鈕時,也會顯示
"這是我的按鈕的事件委託
"訊息框。
下一步,為了發掘
protected
virtual void onclick( eventargs e)
的奧妙,我們在
mybtn
類中覆蓋此函式,並實現了顯示
"mybtn
是從system.windows.forms.button繼承而來,觸發了click事件,但系統**已經失效"的功能。
class
mybtn :system.windows.forms.button }
現在我們再單擊我們的按鈕,猜猜,會發生什麼情況,是顯示幾個訊息框呢?
0個?乙個?二個?
答案是,只顯示了乙個訊息框,
"mybtn
是從system.windows.forms.button繼承而來,觸發了click事件,但系統**已經失效",他並沒有觸發到我們外部定義的訊息處理過程:
private
void mybtn_click(object sender, eventargs e)
由此我們就可以發現,
button
的click
事件是由
onclick
函式來觸發的,由此我們會產生乙個問題,當繼承了
button
類後,我們怎麼才能讓他也能觸發
click
事件呢?
很簡單,我們只需要在我們覆蓋的
onclick
函式中再呼叫一下基類中的
onclick
函式即可。
class
mybtn :system.windows.forms.button }
一切
ok了!
是由基類的
onclick
函式來觸發
click
事件,至於基類的
onclick
是怎麼觸發的,那就得問微軟的人了。j
總結:通過以上的例項我們可以對事件進行總結:類的某個事件是在其內部觸發,往往是由乙個虛函式觸發。類事件通過**與外部的處理函式相關聯,由使用者來實現自己的事件處理過程。 啊
as3按鈕事件
在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...
as3按鈕事件
在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...
as3按鈕事件
在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...