CLR via C#学习笔记-第十三章-定义接口、继承接口
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万能启动利器FbinstTool引导工具
- 下一篇: C#操作 MongoDB【原创】