資源描述:
《委托 事件 觀察者模式資料》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、認(rèn)識(shí)C#中的委托和事件引言委托和事件在.NetFramework中的應(yīng)用非常廣泛,然而,較好地理解委托和事件對(duì)很多接觸C#時(shí)間不長(zhǎng)的人來(lái)說(shuō)并不容易。它們就像是一道檻兒,過(guò)了這個(gè)檻的人,覺(jué)得真是太容易了,而沒(méi)有過(guò)去的人每次見(jiàn)到委托和事件就覺(jué)得心里別(biè)得慌,混身不自在。本文中,我將通過(guò)兩個(gè)范例由淺入深地講述什么是委托、為什么要使用委托、事件的由來(lái)、.NetFramework中的委托和事件、委托和事件對(duì)Observer設(shè)計(jì)模式的意義,對(duì)它們的中間代碼也做了討論。將方法作為方法的參數(shù)我們先不管這個(gè)標(biāo)題如何的繞口,也不管委托究竟是個(gè)什么東西,來(lái)看下面這兩個(gè)最簡(jiǎn)單的方法,它們不過(guò)是在
2、屏幕上輸出一句問(wèn)候的話語(yǔ):publicvoidGreetPeople(stringname){//做某些額外的事情,比如初始化之類,此處略EnglishGreeting(name);}publicvoidEnglishGreeting(stringname){Console.WriteLine("Morning,"+name);}暫且不管這兩個(gè)方法有沒(méi)有什么實(shí)際意義。GreetPeople用于向某人問(wèn)好,當(dāng)我們傳遞代表某人姓名的name參數(shù),比如說(shuō)“Jimmy”,進(jìn)去的時(shí)候,在這個(gè)方法中,將調(diào)用EnglishGreeting方法,再次傳遞name參數(shù),EnglishGreetin
3、g則用于向屏幕輸出“Morning,Jimmy”?,F(xiàn)在假設(shè)這個(gè)程序需要進(jìn)行全球化,哎呀,不好了,我是中國(guó)人,我不明白“Morning”是什么意思,怎么辦呢?好吧,我們?cè)偌觽€(gè)中文版的問(wèn)候方法:publicvoidChineseGreeting(stringname){Console.WriteLine("早上好,"+name);}這時(shí)候,GreetPeople也需要改一改了,不然如何判斷到底用哪個(gè)版本的Greeting問(wèn)候方法合適呢?在進(jìn)行這個(gè)之前,我們最好再定義一個(gè)枚舉作為判斷的依據(jù):publicenumLanguage{English,Chinese}publicvoidGre
4、etPeople(stringname,Languagelang){//做某些額外的事情,比如初始化之類,此處略swith(lang){caseLanguage.English:EnglishGreeting(name);break;caseLanguage.Chinese:ChineseGreeting(name);break;}}OK,盡管這樣解決了問(wèn)題,但我不說(shuō)大家也很容易想到,這個(gè)解決方案的可擴(kuò)展性很差,如果日后我們需要再添加韓文版、日文版,就不得不反復(fù)修改枚舉和GreetPeople()方法,以適應(yīng)新的需求。在考慮新的解決方案之前,我們先看看GreetPeople的方法
5、簽名:publicvoidGreetPeople(stringname,Languagelang)我們僅看stringname,在這里,string是參數(shù)類型,name是參數(shù)變量,當(dāng)我們賦給name字符串“jimmy”時(shí),它就代表“jimmy”這個(gè)值;當(dāng)我們賦給它“張子陽(yáng)”時(shí),它又代表著“張子陽(yáng)”這個(gè)值。然后,我們可以在方法體內(nèi)對(duì)這個(gè)name進(jìn)行其他操作。哎,這簡(jiǎn)直是廢話么,剛學(xué)程序就知道了。如果你再仔細(xì)想想,假如GreetPeople()方法可以接受一個(gè)參數(shù)變量,這個(gè)變量可以代表另一個(gè)方法,當(dāng)我們給這個(gè)變量賦值EnglishGreeting的時(shí)候,它代表著EnglsihGree
6、ting()這個(gè)方法;當(dāng)我們給它賦值ChineseGreeting的時(shí)候,它又代表著ChineseGreeting()方法。我們將這個(gè)參數(shù)變量命名為MakeGreeting,那么不是可以如同給name賦值時(shí)一樣,在調(diào)用GreetPeople()方法的時(shí)候,給這個(gè)MakeGreeting參數(shù)也賦上值么(ChineseGreeting或者EnglsihGreeting等)?然后,我們?cè)诜椒w內(nèi),也可以像使用別的參數(shù)一樣使用MakeGreeting。但是,由于MakeGreeting代表著一個(gè)方法,它的使用方式應(yīng)該和它被賦的方法(比如ChineseGreeting)是一樣的,比如:Ma
7、keGreeting(name);好了,有了思路了,我們現(xiàn)在就來(lái)改改GreetPeople()方法,那么它應(yīng)該是這個(gè)樣子了:publicvoidGreetPeople(stringname,***MakeGreeting){MakeGreeting(name);}注意到***,這個(gè)位置通常放置的應(yīng)該是參數(shù)的類型,但到目前為止,我們僅僅是想到應(yīng)該有個(gè)可以代表方法的參數(shù),并按這個(gè)思路去改寫GreetPeople方法,現(xiàn)在就出現(xiàn)了一個(gè)大問(wèn)題:這個(gè)代表著方法的MakeGreeting參數(shù)