假設沒有事件,我們能不能通過委託實現事件的功能?事實上是可以的。下面我們一步一步剖析!先舉個例子:
有這麼乙個場景,有乙個氣球(相當於事件、訊息的傳送者),氣球**(相當於觸發事件),小孩子聽到氣球**會嚇哭(小孩子相當於乙個事件的訂閱者)。我們不適用事件,使用委託來完成這個程式。
第一步:定義乙個全域性的委託型別, public delegate void bombeventhandler();//定義了乙個委託,其實是乙個類吧,相當於乙個委託類
第二步:定義氣球類(balloonpublisher),很簡單,這個類僅僅用友乙個**的方法,**就發出訊息,我**了,也就是呼叫bomb委託
public class balloonpublisher
} }
第三步:我們實現訂閱者,小孩子類,為了簡單我們僅僅定義乙個被嚇哭的方法
public class childrensubscribe}
一切定義好了,就等著關聯了,客戶端進行關聯:
static void main(string args)
執行結果很明白,當**觸發時候,小孩子嚇哭這個方法也在這個委託鏈上所以也就執行了嚇哭方法。
回顧下上面的過程,和事件功能完全一樣,說明委託完全可以實現事件的功能!可是為什麼會有事件的產生呢?對上面的例子我們可以這麼想,氣球**是屬於氣球本身的,與客戶端沒關係,只有氣球才能觸發**這個方法,可是我們上面這個例子是可以通過客戶端直接觸發氣球**的,比如 pb.bomb();直接觸發**委託,也能把小孩嚇哭。這樣就破壞了封裝性。這是事件產生的第乙個原因。
假如氣球**後,不僅僅引起小孩子哭,還會引起大人尋找那的氣球**了,周圍的鳥也會飛走等一系列事件。這就需要把這些方法都得加入到委託連pb.bomb中去。
如果客戶端不小心把把這個委託連弄斷了或者改變了,將會引起很大的麻煩,所有訂閱的類都失敗了。
為了解決以上問題,事件才應運而生的,其實事件就是對委託的封裝罷了,具體內部實現我就不多說了,網上多的是。
下面給出利用事件完成此功能的程式:其實很簡單,把氣球類裡面的委託換成事件定義即可,這樣以後,你在客戶端 直接呼叫pb.bombevent();是有語法錯誤的,從而確保了封裝性和事件也只能有氣球本身觸發,與客戶端沒任何關係
public class balloonpublisher
} }
事件的前世今生,委託和事件關係
假設沒有事件,我們能不能通過委託實現事件的功能?事實上是可以的。下面我們一步一步剖析!先舉個例子 有這麼乙個場景,有乙個氣球 相當於事件 訊息的傳送者 氣球 相當於觸發事件 小孩子聽到氣球 會嚇哭 小孩子相當於乙個事件的訂閱者 我們不適用事件,使用委託來完成這個程式。第一步 定義乙個全域性的委託型別...
委託的前世今生
1 namespace heater219 20 21 22 23 24public class alarm度了 param 28 29 3031 public class display 度 param 36 37 3839 class program 4052 53 54.net framewo...
委託的前世今生
學習委託那段時間是我對程式設計最頭疼的幾個時間段之一,net中的委託自從出現以來,就開始了它征服程式設計師和被程式設計師征服的歷程。直到現在,我依然不敢說自己對委託的認識已經足夠清晰,也許它並不很難,可是我覺得它很繞。今天說說委託的前世今生,不知道對學習委託的人有沒有用。委託前世 與指標的各種糾葛 ...