天天看點

委托與事件一、委托的來曆二、對“委托與事件”的了解三、用事實說話

    在c++中有各種各樣的指針,其中,有一種指針是指向函數或者說是指向方法的,我們可以通過調用這個指針來調用其指向的方法。但是,這樣的指針是不安全的。如果我們簡單的把c++的指針認為是一個記錄記憶體位址的空間,那麼,方法指針裡記錄的就是目标方法的調用位址。但是,c++并沒有對指針指向的對象加以任何的限制,你不知道這個方法會傳回什麼,不知道這個方法要接收多少個參數,也不知道接收的參數又是什麼類型,并且在c++中,指針還可以參與運算。是以,對于調用者而言,除了看到一個位址,其餘一概不知道,一切要等到調用以後才真向大白。這樣的指針常常被一些不軌之人所利用,讓方法指針指向一個破壞系統的方法,就好比給你一把鑰匙,讓你打開一個盒子,盒子裡面是什麼?也許是蛋糕,也許那就是潘多拉之盒。 

    由于方法指針不完善,c#針對這一現象進行了改進——委托。委托的作用與方法指針一樣,用它來指向一個方法,并且提供給客戶程式調用。但這個方法指針是有限制的,它規定好了所指向方法的傳回值、參數個數以及各個參數的類型。是以,這把“鑰匙”能打開蛋糕盒卻打不開潘多拉之盒,感覺安全多了。

    委托是對函數的封裝可以當作給方法的特征指定一個名稱。方法是将類型參數化,所謂類型參數化就是說該方法接受一個參數,而該參數是某種類型的參數,比如int、string等等;而委托是将方法參數化,也就是将方法作為一個參數傳到一個委托中。

    委托是一種引用方法的類型,一旦為委托配置設定了方法,委托将與該方法具有完全相同的行為。委托用關鍵字delegate來聲明。事件是說在發生其他類或對象關注的事情時,類或對象可通過事件通知它們,事件對象用關鍵字event來聲明。

    委托與事件的協同合作,使得兩個需要存在調用關系的類型,在各自的實作中不必編寫實際的調用代碼,它們隻是通過一個事件和一個第三方的委托類型完成了消息的傳遞過程。這樣兩個類型之間不存在任何的緊密耦合,實作了“高聚合”和“低耦合”。 

1.需求:

有一隻tom貓,每當他叫“喵,我是tom.”的時候,兩隻小老鼠jack和dam就會說“貓來了,快跑吧!”。

2.分析:

該例子涉及兩個類,cat和mouse。在main函數中,當cat的shout方法觸發時,mouse就執行run方法。如何讓這兩個方法相關聯呢,在這裡就要用到委托和事件了。

3.實作:

說明:

"+="增加委托執行個體對象的意思。執行個體化委托有兩種方法:

(1):直接将方法指派[=]或者用“+=”給一個委托==>委托名 =[+=]  方法名

(2):委托本質也是一個類,隻是一個特殊的類,是以我們也可以執行個體化一個委托對象通過委托構造函數來注冊委托==》委托名對象名= new 委托名(方法名) 

"-="移除委托。

(以上使用無參數的委托事件,還可以添加參數)

4.效果:

委托與事件一、委托的來曆二、對“委托與事件”的了解三、用事實說話

5.了解:

  學習要簡單化,說實話委托和事件确實挺難了解的,我現在了解得還很膚淺。通過這個例子,我們可以這樣認為,catshouteventhandler委托将方法catshout和老鼠的run聯系在一起,當cat發生shout時,觸發mouse發生run。使用委托分三步,定義、執行個體化、調用。學習是個循序漸進的過程,暫且這樣了解吧。歡迎大家評論交流。