這篇文章主要介紹.NET中委托與接口的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、興慶網(wǎng)絡(luò)推廣、成都微信小程序、興慶網(wǎng)絡(luò)營銷、興慶企業(yè)策劃、興慶品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供興慶建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:vcdvsql.cn
委托:
委托是一種定義方法簽名的類型。當(dāng)實例化委托時,您可以將其實例與任何具有兼容簽名的方法相關(guān)聯(lián)。您可以通過委托實例調(diào)用方法。
委托用于將方法作為參數(shù)傳遞給其他方法。事件處理程序就是通過委托調(diào)用的方法。您可以創(chuàng)建一個自定義方法,當(dāng)發(fā)生特定事件時某個類(例如 Windows 控件)就可以調(diào)用您的方法.
委托具有以下特點:
委托類似于 C++ 函數(shù)指針,但它們是類型安全的。
委托允許將方法作為參數(shù)進(jìn)行傳遞。
委托可用于定義回調(diào)方法。
委托可以鏈接在一起;例如,可以對一個事件調(diào)用多個方法。
方法不必與委托簽名完全匹配。有關(guān)更多信息,請參見在委托中使用變體(C# 和 Visual Basic)。
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨定義的方法。C# 3.0 引入了 Lambda 表達(dá)式,利用它們可以更簡練地編寫內(nèi)聯(lián)代碼塊。匿名方法和 Lambda 表達(dá)式(在某些上下文中)都可編譯為委托類型。這些功能統(tǒng)稱為匿名函數(shù)。有關(guān) Lambda 表達(dá)式的更多信息,請參見Anonymous Functions (C# Programming Guide)。
接口:
接口描述的是可屬于任何類或結(jié)構(gòu)的一組相關(guān)功能。接口可由方法、屬性、事件、索引器或這四種成員類型的任意組合構(gòu)成。接口不能包含字段。接口成員一定是公共的。
當(dāng)類或結(jié)構(gòu)繼承接口時,意味著該類或結(jié)構(gòu)為該接口定義的所有成員提供實現(xiàn)。接口本身不提供類或結(jié)構(gòu)能夠以繼承基類功能的方式繼承的任何功能。但是,如果基類實現(xiàn)接口,派生類將繼承該實現(xiàn)。
類和結(jié)構(gòu)可以按照類繼承基類或結(jié)構(gòu)的類似方式繼承接口,但有兩個例外:
類或結(jié)構(gòu)可繼承多個接口。
類或結(jié)構(gòu)繼承接口時,僅繼承方法名稱和簽名,因為接口本身不包含實現(xiàn)。
接口具有下列屬性:
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實現(xiàn)接口的所有成員。
不能直接實例化接口。
接口可以包含事件、索引器、方法和屬性。
接口不包含方法的實現(xiàn)。
類和結(jié)構(gòu)可從多個接口繼承。
接口自身可從多個接口繼承。
正文開始
在寫這些文字的時候我又將以上的各個概念熟悉了一遍,以防自己把自己忽悠混淆了.所以不適合群眾請盡快退散.另外如果您看完上面的定義和特征后就從兩者的混淆中走了出來,您也可以嘗試?yán)^續(xù)往下看.
首先,關(guān)于委托的用法,我們可以這樣使用:
public int Calculate(Func<int, int, int> del) { int a = 1, b = 2; return del(a, b); }
我們可以通過傳不同的Func來改變整個方法的結(jié)果.
public int Add(int a, int b) { return a + b; } public int Sub(int a, int b) { return a - b; } //調(diào)用方法如下 public void TestMethod() { int result = Calculate(Add);//the result is 3 int anotherResult = Calculate(Sub);//the result is -1 }
首先我在Calculate方法中已經(jīng)確定了2個數(shù)的值,并且包括在該方法當(dāng)中.在輸出結(jié)果的時候能明顯看出傳遞的委托不同,其結(jié)果也不同.我們使用委托來改變方法的執(zhí)行內(nèi)容,我們不但可以改變其方法的內(nèi)容,也可以在執(zhí)行該方法的時候順便做點什么(比如說做個日志記錄).
噢,可能您覺得二者容易混淆的地方在于..我還是舉個例子比較好解釋. : )
public interface ICal { int Calculate(int a, int b); } //有多個類實現(xiàn)了ICal接口. public class Add : ICal { public int Calculate(int a, int b) { return a + b; } } public class Sub : ICal { public int Calculate(int a, int b) { return a - b; } } //然后通過調(diào)用不同類來獲取不同的方法 public static void Main() { ICal cal = new Add(); //ICal=new Sub(); Console.Write(cal.Calculate(1, 2)); }
講解一下,通過上面的例子我們可以知道在創(chuàng)建一個具有計算功能(Calculate)的接口ICal之后,產(chǎn)生了兩個具有計算功能的具體類,分別是Add和Sub.為了要獲得結(jié)果,我們創(chuàng)建了一個需要有計算功能的”坑”,并賦予能與此”坑”相匹配的類Add(或Sub),***從該坑中調(diào)用Calculate的結(jié)果就行.
貌似說的過去?好,那么我至少要讓你覺得有個適用范圍吧!看下面的例子.
比如有個Person類的數(shù)組arr.這時候我們可以通過委托的方法實現(xiàn)arr的排序.可是系統(tǒng)怎么知道2個Person哪個排在前面,哪個該排在后面?這時候我們就可以傳進(jìn)一個委托來告訴系統(tǒng)Peron類的大小.
arr.Sort(p => { p.ID });
該lambda表達(dá)式意思是丟給該Sort方法一個排序的Key(此key能夠進(jìn)行大小比較),那么Sort就可以根據(jù)此key來進(jìn)行比較.那通過接口呢?首先得創(chuàng)建一個繼承自IComparer<Person>的類,我就拿本身繼承它吧.
好吧,它本來是很麻煩的:
private int SortDelegate(Person p) { return p.ID; } public void TestMethod() { arr.Sort(new Func<Person, int>(SortDelegate)); }
但是我們要承認(rèn)C# 3.0帶給我們的便利.
現(xiàn)在,我們要讓Person類實現(xiàn)接口的規(guī)定.
public int Compare(Person x, Person y) { //假設(shè)person的ID是int類型 return x.ID - y.ID; }
那么我們的實現(xiàn)方法就可能是這樣:
arr.Sort((new Person() as IComparer<Peron>) comp);
不能再繼續(xù)舉例子了,我承認(rèn)我忽悠您了.這些看上去都可以的實現(xiàn)方法有本質(zhì)的區(qū)別!
首先我們看***個委托例子:在Calculate時我們的委托被允許使用了該方法內(nèi)的兩個變量a,b從而改變了整個方法的結(jié)果.在整個過程中委托時很被動的,因為它不知道自己會在什么時候被觸發(fā).上面的例子很簡單,使您沒有這種感覺,而且前面說過在方法執(zhí)行的時候當(dāng)委托被觸發(fā)我們可以干點別的,比如說做個日志記錄什么的,此時接口有能力又不破壞方法本身運(yùn)行結(jié)構(gòu),又能做日志記錄嗎?顯然實現(xiàn)了接口的類只能重寫一遍該方法.
路人甲:那我在接口的實現(xiàn)中再調(diào)用一下原方法,***在方法的前面或后面加入日志記錄功能不就完了嗎?
Snake:殺雞焉用宰牛刀?且不說再原方法的可行性,就算可行了,麻煩不說,萬一這個方法執(zhí)行有多個階段,每個階段都要日志記錄呢?委托能深入方法,并且由方法控制它安放之地,讓委托能起到關(guān)鍵作用,此時作為接口大哥的牛刀也剔不干凈雞骨上的肉喲~.
其次說接口的優(yōu)點.我們前面可以看到委托能深入方法,也就是說委托的關(guān)注群體是方法們,而接口關(guān)注的群體則是類們.接口讓類必須實現(xiàn)相同簽名的方法或?qū)傩?以便在程序中通過調(diào)用可變的方法.既然是因為類的關(guān)系,那么它的方法肯定是不可變的了,每個實現(xiàn)了該接口的類,即便功能差不多也要完完全全寫一遍,但是類的地盤大,肚子里的墨水多,雖然在Add類中通過ICal可調(diào)用的方法也就一個Calculate(),但是在Calculate始終是Add類的子民,所以該Calculate方法可以調(diào)用Add類中所有能調(diào)用的資源.而如果是Sub類的話,它的子民Caculate可調(diào)用的資源又與Add類不盡相同,畢竟同是Calculate,國籍不同,文化和生活方式也不同嘛,哈哈.
而接口的能力卻是委托所不能企及的地方.它只能被方法藏在伸出,方法外一片藍(lán)天而它卻無能為力.如果讓類比作一個國家,方法比作一個人,那么委托不就是深藏在人大腦內(nèi)的處理方式的思維嗎?不同的人,思維可以變,當(dāng)鄉(xiāng)下人看到城市中的高樓大廈不禁感嘆,可鄉(xiāng)下人在城市中生活習(xí)慣之后,高樓大廈又能怎樣,他早已習(xí)以為常.
以上是“.NET中委托與接口的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁題目:.NET中委托與接口的示例分析
文章路徑:http://vcdvsql.cn/article40/pehieo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)站改版、網(wǎng)站設(shè)計公司、域名注冊、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)