一:前言
本小節(jié),我們需要停一停我們的小游戲開發(fā),雖然它現(xiàn)在還不完美,還很簡單,甚至還有BUG。但是,為了更好的理解C#,現(xiàn)在到了該深入了解一些基礎(chǔ)知識的時候了。
當(dāng)然,實際上,本小節(jié)內(nèi)容對于零基礎(chǔ)入門的初學(xué)者來說,還是有點難了。委托與事件,如果只是泛泛的說一下,可能就是一兩句話。但是,我們的課程要遵循一個原則:知其然,知其所以然。所以,本小節(jié)的內(nèi)容實際上有點多,但是我希望大家細細品味,爭取徹底消化委托和事件這兩個概念。
同時,本課程還要教會大家使用一個工具,分析代碼。
二:委托的現(xiàn)實場景:賣家委托快遞去送貨?
任何事情,首先都要問一個為什么。這里的問題是:為什么賣家要委托快遞去送貨?
因為他干不了。他在北京賣一個壺到上海,他不應(yīng)該、也沒能力自己跑到上海交給人家。所以他要“委托”給別人來做這件事情。
在代碼的世界中,也是這樣,我們的打老鼠游戲中,現(xiàn)在所有的邏輯代碼都在窗體的后臺中,隨著我們學(xué)習(xí)面向?qū)ο?,對代碼進行重構(gòu)之后,業(yè)務(wù)邏輯代碼就會放到別的類中,這個“別的類”要負責(zé)“游戲開始”的邏輯,其中“游戲開始”的邏輯中有一個環(huán)節(jié)就是要在界面上顯示”游戲開始“。因為業(yè)務(wù)類不擁有窗體,所以它就不能顯示“游戲開始”,這個時候“委托”就派上用場了。也就是業(yè)務(wù)類不應(yīng)該、也沒能力直接對窗體顯示“游戲開始”,于是,它“委托”窗體顯示“游戲開始”。
三:委托是什么?
我們還是先回到賣家賣壺的例子來描述:“委托是什么”。實際上,賣家委托快遞送貨,需要如下一些代碼:
“委托是什么”這個問題是表象,實際上它還隱藏著5個小問題:
1:委托聲明是什么?
2:委托變量是什么?
3:什么是委托變量賦值?
4:什么是委托處理器?
5:如何調(diào)用委托?
在上圖代碼中,這5個小問題的序號正好對應(yīng)了圖中的數(shù)字部分,
首先,程序得有一個地方聲明委托;
其次,賣家自己還得定義一個委托變量;
再次,通過某種形式給賣家的委托變量賦值,這個值是什么呢,就是一個委托處理器的“引用”。委托處理器就是一個方法,所以,賦值的過程,就是將方法的引用賦值給委托變量。
最后,調(diào)用委托,實際上,就是使用委托變量。
備注,要注意的是,委托聲明和委托處理器的返回值和參數(shù)必須保持一致。
四:委托本質(zhì)上是什么?
上文我們闡述了委托是什么,實際我們僅僅闡述的是委托的表象是什么,那么,委托本質(zhì)上是什么呢?
到現(xiàn)在為止,我們已經(jīng)學(xué)過了兩個類型的概念:類和枚舉。我們在這里要強調(diào)的是,上文代碼的委托聲明中的”SendPRoductHandler“實際上,是一個類,我們應(yīng)該將其看為:
internal class SendProductHandler : System.MulticastDelegate { public SendProductHandler(object @object, IntPtr method) { }
public virtual IAsyncResult BeginInvoke(string product, AsyncCallback callback, object @object) { }
public virtual void EndInvoke(IAsyncResult result) { }
public virtual void Invoke(string product) { } }
為什么是這樣的呢,相信你看了下面的視頻就會明白。
五:視頻
非公開部分,請聯(lián)系最課程(www.zuikc.com)觀看。
六:事件是什么?
知道了委托,我們來看事件,將小節(jié)”二:委托是什么“中的代碼2和3處,修改為:
“委托”就變成“事件”了。
使用事件后,你可以為你的委托變量_sendProduct,增加多個方法,你看,代碼中的位置3處,不再是個“=”號,而是一個“+=”號了。
新聞熱點
疑難解答