日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

CLR via C#学习笔记-第十三章-定义接口、继承接口

發(fā)布時間:2023/12/10 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CLR via C#学习笔记-第十三章-定义接口、继承接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

13.1?類和接口繼承

接口是為了實現(xiàn)多繼承

所有的類都繼承了System.Object,及其四個公共實例方法:ToString、Equals、GetHashCode、GetType。

CLR允許定義接口,它實際只是對一組方法簽名進(jìn)行了統(tǒng)一命名。這些方法不提供任何實現(xiàn)。

類通過指定接口名稱來繼承接口,而且必須顯式實現(xiàn)接口方法,否則CLR認(rèn)為此類型定義無效。

實現(xiàn)接口方法的過程比較繁瑣,所以說接口繼承是實現(xiàn)多繼承的一種縮水版機制。

編譯器和CLR允許一個類繼承多個接口,繼承的所有接口都必須實現(xiàn)。

?

接口繼承特點

類繼承的一個重要特點是,凡是能使用基類型實例的地方,都能使用派生類型的實例。

類似的,凡是能夠使用具名接口類型的實例的地方,都能使用實現(xiàn)了接口的一個類型的實例。

?

13.2?定義接口

接口還能定義事件、無參屬性和有參屬性。

所有這些東西的本質(zhì)上都是方法,他們只是語法上的簡化。

不過接口不能定義任何構(gòu)造器方法,也不能定義任何實例字段。

?

接口不能定義靜態(tài)成員

CLR允許接口定義靜態(tài)方法、字段、常量和構(gòu)造器,但符合CLS標(biāo)準(zhǔn)的接口決不允許,C#禁止接口定義任何一種靜態(tài)成員。

?

接口定義就是類型定義

在CLR看來,接口定義就是類型定義。

也就是說CLR會為接口類型對象定義內(nèi)部數(shù)據(jù)結(jié)構(gòu),同時可通過反射機制來查詢接口類型的功能。

和類型一樣,接口可在文件范圍中定義,也可嵌套在另一個類型中。定義接口類型時可指定你希望的任何可見性、可訪問性。

?

接口繼承不是嚴(yán)格的繼承

接口定義可以從另一個或多個接口繼承。但它不是嚴(yán)格的繼承。

接口繼承的工作方式并不完全和類繼承一樣。

作者傾向于將接口結(jié)成看成是將其他接口的協(xié)定contract包括到2新接口中。

例如ICollection<T>接口定義包含了IEnumerable<T>和IEnumerable兩個接口的協(xié)定,有下面兩層含義:

1.繼承ICollection<T>接口的任何類必須實現(xiàn)ICollection<T>、IEnumerable<T>和IEnumerable三個接口所定義的方法。

2.任何代碼在引用實現(xiàn)ICollection<T>接口的對象時,該類型還實現(xiàn)了IEnumerable<T>和IEnumerable接口。

?

13.3?繼承接口

顯式為實現(xiàn)接口的方法標(biāo)記virtual和隱式的區(qū)別

編譯器要求將實現(xiàn)接口的方法標(biāo)記為public。

CLR要求將接口方法標(biāo)記為virtual,編譯器會將他們標(biāo)記為virtual和sealed。這會阻止派生類重寫接口方法。

將方法顯式標(biāo)記為virtual,編譯器就會將該方法標(biāo)記為virtual并保持它的非密封狀態(tài),使派生類能重寫它。

?

派生類重寫基類實現(xiàn)的接口方法

派生類不能重寫sealed的接口方法,但派生類可重新繼承同一個接口,并為接口方法提供自己的實現(xiàn)。

下例對此進(jìn)行了演示:

//派生自O(shè)bject,他實現(xiàn)了IDisposable internal class Base:IDisposable{public void Dispose(){Console.WriteLine("Base's Dispose");} } //重新實現(xiàn)了IDisposable internal class Derived:Base,IDisposable{new public void Dispose(){Console.WriteLine("Base's Dispose");} }

在Main函數(shù)中進(jìn)行調(diào)用:

/*****************第一個例子****************/ Base b=new Base(); //用b的類型調(diào)用Dispose,顯示"Base's Dispose" b.Dispose(); //用b的對象的類型調(diào)用Dispose,顯示"Base's Dispose" ((IDisposable)b).Dispose();/*****************第二個例子****************/ Derived d=new Derived(); //用d的類型調(diào)用Dispose,顯示"Derived's Dispose" d.Dispose(); //用d的對象的類型調(diào)用Dispose,顯示"Derived's Dispose" ((IDisposable)d).Dispose();/*****************第三個例子****************/ b=new Derived(); //用b的類型調(diào)用Dispose,顯示"Base's Dispose" b.Dispose(); //用b的對象的類型調(diào)用Dispose,顯示"Derived's Dispose" ((IDisposable)b).Dispose();

?

轉(zhuǎn)載于:https://www.cnblogs.com/errornull/p/9905469.html

總結(jié)

以上是生活随笔為你收集整理的CLR via C#学习笔记-第十三章-定义接口、继承接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。