国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

7、接口

2019-11-17 02:30:53
字體:
來源:轉載
供稿:網友

7、接口

2015-03-19 14:07 by 七星端硯, ... 閱讀, ... 評論, 收藏, 編輯 過渡到C#的高級特性,本次主要陳述一下接口的相關知識點。主要涉及到:1、接口的定義和實現,以及理解構建支持多種行為的類型有哪些優勢。2、接口引用、顯示接口實現以及接口層次結構的構建。3、還會涉及到一些.net基礎類庫中的標準接口。我們可以看到自定義類和結構完全可以實現這些預定義的接口,以支持對象克隆、對象枚舉和對象排序等高級行為。

一、接口類型

接口就是一組抽象成員的集合。之前說過,抽象方法是純粹的協議,在其中沒有提供默認的實現。(接口定義成員模擬行為)tips:一個類可以支持任意數量的接口,因此也就只吃了多種行為。接口定義形式如下:public interface Iinterface{ void OnTouchMove();//抽象成員}1、接口和抽象基類的區別。接口和抽象基類很類似。如果類被標記為抽象的,他可以定義許多抽象成員來為所有派生類型提供多態接口。區別一,類完全還可以定義許多構造函數,字段數據和非抽象成員(具有實現)等。但是接口只能包含抽象成員。區別二,抽象類中接口如果想要實現,子類必須繼承。而一個子類只能有一個父類,所以子類不能再繼承另一個抽象類中接口(方法)。但一個類可以有任意數量接口,也就是說可以通過接口擴展許多行為。區別三,傳統抽象基類的另一個限制就是每一個派生類型必須處理這一組抽象成員,并且提供實現。這就使得子類有可能實現了許多冗余的方法。

二、創建自定義接口

接口使用C#關鍵字interface來定義:注意:我們定義接口成員,不需要為這個成員定義實現作用域。因為接口是純粹的協議,如果我們定義實現,會產生編譯錯誤。不過,.net接口還可以定義許多屬性協議,我們更新上面接口如下:接口除非被類或接口實現,否則接口沒有什么用,接下來,我們將講述一下接口的實現。

三、實現接口

如果類(或結構)選擇通過支持接口來擴展功能,就需要在其類型定義中使用逗號分隔的列表。要知道,直接基類必須是冒號操作符后的第一個項。如:public class Pencil:Ipointy{...}public class Fork:Utensil,Ipointy{....}注意:實現接口是一個“要么全要,要么全部要”的命題,也就是說支持類型無法選擇實現哪些成員。例如: class Triangle : IPointy //在此處,右鍵點擊實現接口,則會自動將接口中的內容實現。修改實現體就可以達到我們想要實現的效果。(如果實現多個接口并且有重復的名字的成員,可以通過顯式實現接口解決。) { public byte Ponits { get { return 6; } } public byte GetNumberOfPoints() { Console.WriteLine("Interface!"); return 0; } }

四、在對象級別調用接口成員

Triangle類已經實現了IPointy 接口,有了Points屬性,用法如下:運行結果如下:這種情況下,是沒有問題的,但是如果一個類沒有實現接口,調用Points屬性的時候,就會出現編譯錯誤。因此,有的時候就需要判斷一個類型支持哪些接口,就用到了下面的方法:1、try-catch邏輯,接口強制轉換中如果不支持這個接口,就會出現無效轉換異常(InvalidCastException)。(不是最好的)2、獲取接口引用:as關鍵字。例如新的類型A判斷則可以如下:A a=new A();IPointy ips= a asIPointy ;//接下來判斷ips是不是為空,然后輸出其Points屬性。3、獲取接口引用:is關鍵字用法:if(a isIPointy){Console.Write((IPointy)a.Points);}else //...

五、接口作為參數

用法如下:

六、接口作為返回值

接口也可以用作方法的返回值。用法如下:結果:

七、接口類型數組

同樣的類型可以由多個類型實現,即使這些類型不處于相同的類層次結構中,并且除System.Object以外,也沒有其他的公共父類。這可以產生出許多非常強大的編程結構。如果已經定義了A,B,C類型,那么現在可以定義一個支持IPointy接口的對象數組:IPointy[] myPionty = {new A(), new B(), new C()};foreach(IPointy i in myPointy){Console.Write(i.Ponits);}

八、接口的層次結構

接口可以組織成接口層次結構,和類層次結構相似,如果接口擴展了既有接口,它就繼承了父接口定義的抽象成員,當然,和基于類的繼承不同的是,派生接口不會繼承真正的實現,而是通過額外的抽象成員擴展了其自身的定義。和類不同,一個接口可以擴展多個基接口,這就允許我們設計非常強大、非常靈活的抽象。接口在以下兩個方面特別有用:1、只有一個層次結構,但是只有一部分派生類支持某個公共行為。2、需要構建的公共行為跨多個層次結構,而且除了System.Object以外,沒有其他的公共父類。

九、構建可枚舉類型(IEnumerable和IEnumerator)

我們知道,IEnumerable和IEnumerator的作用是使得C#支持foreach關鍵字,允許我們遍歷任何數組類型的內容。雖然,看上去只有數組類型才可以使用這個結構,其實任何支持GetEnumerator()方法的類型都可以通過foreach結構進行運算。看如下代碼:執行結果:出現如此錯誤的原因是因為我們的類不是實現名為GetEnumerator()的方法。將TheFather類進行如下更改,則編譯安全通過:在以前,如果我們希望構建支持foreach枚舉的自定義集合,只能實現IEnumerable接口,可能還有IEnumerator接口,然而還可以通過迭代器來構建使用foreach循環的類型。1、用yield關鍵字構建迭代器方法。簡單來說,迭代器就是這樣一個成員方法,它制定了容器內部項被foreach處理時該如何返回。雖然迭代器方法還必須命名為GetEnumerator方法,返回值還必須是IEnumerator類型,但自定義類不需要實現原來那些接口了。修改TheFather類如下,將會實現和上述一樣的功能,編譯依舊可以安全通過:yield關鍵字用來向調用方的foreach結構指定返回值。當到達yield return語句后,當前位置被存儲下來,下次調用迭代器會從這個位置開始執行。2、構建命名迭代器更有趣的是,yield關鍵字從技術上說可以結合任何方法一起使用,無論方法名是什么。這就是命名迭代器技術。它的好處在于可以接受許多參數。注意,這些方法返回IEnumerable接口,而不是期望的IEnumerator兼容類型。修改TheFather類如下:同時需要修改主函數內的迭代:3、迭代器方法的內部表示如果C#編譯器遇到迭代器方法,它就會在定義類型的作用域內動態生成嵌套類。記住,如果自定義類型要和C#的foreach關鍵字一起使用,容器就需要定義一個名為GetEnumerator的方法,它由IEnumerable接口類型來定制。通常,這個方法的實現只是交給保存子對象的內部成員,然而,我們也可以使用yield return語法來提供多個“命名迭代器”方法。

十、構建可克隆的對象(ICloneable)

之前提到過,System.Object定義了一個名為MemberwiseClone的成員。這個方法用來獲取當前對象的一份淺復制。因為它是受保護的,對象用戶不會直接調用到這個方法,而一個對象可能在克隆過程中自己調用這個方法。之前還提到的引用類型和值類型里面有,如果給一個引用變量分配另一個引用變量,將有兩個引用指向內存中同一個對象,對其中一個的操作,將會將兩個引用全部改變。如果想要使自己自定義類型支持向調用方法返回自身同樣副本的能力,需要實現標準的ICloneable接口。使用方法:class A:ICloneable{ public object Clone(){return new A();}//實現的Clone方法返回當前對象的一個副本。}用的時候:static void Main(){ A a = new A(); A b = (A)a.Clone();//這種情況下,當修改b內的成員的時候,a內的成員不會被改變。}對于更深層次的復制,在這里不做過多陳述。

十一、構建可比較的對象

System.IComparable接口指定了一種允許一個對象可基于某些特定鍵值進行排序的行為。接口正式定義:public interface IComparable{ int CompareTo(object o);}代碼如下:構建自定義類型的時候,可以實現IComparable以使得該類型數組可被排序,充實CompareTo的細節時候,需要決定排序操作的基準。修改代碼如下:下面是main函數的代碼:運行結果:除此之外,我們還一顆指定多個排序順序,以及自定義屬性和自定義排序類型。在此不再陳述。

十二、小結

接口可以被定義為抽象成員的集合。因為接口不提供任何實現細節,通常把接口看做某個類型支持的行為。C#提供了interface關鍵字來允許我們創建接口,。并且類可以實現多個接口,中間通過逗號進行分割。除此之外,我們還陳述了幾個標準接口的實現,以獲得諸如克隆排序和枚舉的功能。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元朗区| 竹溪县| 阿拉善左旗| 海宁市| 隆回县| 东平县| 抚宁县| 股票| 云阳县| 新干县| 金湖县| 太康县| 岳池县| 纳雍县| 泌阳县| 嘉善县| 绥滨县| 库车县| 昭通市| 穆棱市| 扶余县| 平山县| 文昌市| 确山县| 永登县| 威海市| 峨边| 呼伦贝尔市| 蓝田县| 麻江县| 措勤县| 江达县| 都兰县| 浪卡子县| 大埔区| 澄迈县| 通道| 阿拉善盟| 甘孜县| 开阳县| 枝江市|