Event Delegate 在好多地方多看到了,比如在學習web user control 的時侯,還有vb.net remoting object 的時候。
我看了不少文章後,也不是很明白。我在這裡寫下來,主要是為了我自己以後的回故。同時,也想讓大家參考。
要理解event delegate, 當然要先明白什麼是event. 其實簡單的想,就是"回叫"的機制,她解決一個依賴的問題。 比如真實世界裡你的經理讓你算算今年的稅金。 想象一下,你的經理他每隔5分鐘會打電話給你,問你做完了嗎。 一個到半夜他也沒歇著, 當然你也沒歇著。 沒有EVENT方法,就得寫成LOOP語句去不停的檢查一個任務是否完成。這和那個經理的做法類似。
後來,到第二年,經理又讓你算算這年的稅金。這次你主動說了,這次我什麼時候做完,什麼時候打電話給你。 經理好象還沒聽明白。你又說了一邊"你別打給我,我會打給你的"。你算完稅後, 打電話給經理的動作就是一個事件, 或者說就是“回叫”。
回到編成上,一共有三種回叫方式, 第一種“interface”, 第二種“function pointer (方程指標)”, 第三種“delegate (委託)”。 我對第三種方式有點瞭解,就是委託。微軟webcast上有李建忠老師的觀察者模式的視頻教程, 他說委託其實就是觀察者模式。大家可以去下載看看。看網上其它的教程, 講委託是集合interface 和 function pointer 的優點。不過速度上好象不如function pointer, 但可以象interface 一樣是強類行的。 強類行就是說, 調用委託的方法時,它的參數和傳回值是必須和聲明委託時的方法和返回對應起來。
編程上看,delegate是非常簡單的。
看看下面這幾個圖片,是個完整的,簡單的小demo。
總共就三個檔案, 分別是: delegate.vb, Employee.vb, Manager.vb 這是一個winform 應用程式
delegate.vb 裡的代碼就一行。 就是定義delegate 方法的簽名, 委託有什麼參數, 有沒有傳回值。 這裡的例子代碼只要一個參數,就是經理的名字。 也不需要傳回值。
所以用的是sub. 如果要有傳回值, 就要用function。 下面是function 的代碼, delegate function CallBackManager(byval name as String) as Boolean
Employee.vb 裡代碼是下面代碼內容:
1。 在employee內聲明這個委託, 也就是說employee 有這個屬性了。
2和3。 是來給employee 的這個委託屬性付值。
4, 這行是employee 做完計算,然後觸發打電話的事情。 invoke (觸發)就是觸發mdlgCallBackManager 指向的方法。 這個被指向的方法在下一段代碼中。我同時又把deleagte.vb裡的那行代碼貼在下面了, 並用紅線串連著。 這你就注意到他們的簽名要一樣。 也就是所謂的強型別了。
最後,就是manager form 裡的代碼。 下面就是。先是建立employee的執行個體, 然後在form load 方法裡註冊我要把我的哪個方法委託給employee,換句話說就是付值給employee裡的mdlgCallBackManager 屬性。 我把Callme 委託給employee, 那麼他簽名也是要一致的。
好, 如果我運行代碼,然後點button1, 我就會看到下面一樣的內容
這是我所理解的delegate 內容, Event和delegate 其實是一樣。 過兩天我要把上面的代碼重寫成event. 比較後會覺很相似。 delegate 還有非同步方法。