注意:我們定義接口成員,不需要為這個成員定義實現作用域。因為接口是純粹的協議,如果我們定義實現,會產生編譯錯誤。不過,.net接口還可以定義許多屬性協議,我們更新上面接口如下:
接口除非被類或接口實現,否則接口沒有什么用,接下來,我們將講述一下接口的實現。
運行結果如下:
這種情況下,是沒有問題的,但是如果一個類沒有實現接口,調用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 //...
結果:
執行結果:
出現如此錯誤的原因是因為我們的類不是實現名為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語法來提供多個“命名迭代器”方法。
構建自定義類型的時候,可以實現IComparable以使得該類型數組可被排序,充實CompareTo的細節時候,需要決定排序操作的基準。修改代碼如下:
下面是main函數的代碼:
運行結果:
除此之外,我們還一顆指定多個排序順序,以及自定義屬性和自定義排序類型。在此不再陳述。
新聞熱點
疑難解答