網(wǎng)上有哪些網(wǎng)站做兼職,學(xué)seo推廣,襄陽營銷型網(wǎng)站建設(shè),hemi網(wǎng)站怎么做熱圖第十三章 接口
類和接口繼承 CLR不支持多繼承,因此所有托管編程語言都不支持任何類都從且只能從一個(gè)類派生(最終從Object類派生)定義接口實(shí)際只是對(duì)一組方法進(jìn)行了統(tǒng)一的命名,類通過指定接口名稱來繼承接口,且必須顯式…第十三章 接口
- 類和接口繼承
- CLR不支持多繼承,因此所有托管編程語言都不支持
- 任何類都從且只能從一個(gè)類派生(最終從Object類派生)
- 定義接口實(shí)際只是對(duì)一組方法進(jìn)行了統(tǒng)一的命名,類通過指定接口名稱來繼承接口,且必須顯式實(shí)現(xiàn)接口方法
- 接口可以定義方法、事件、無參屬性和有參屬性(索引器);不能定義構(gòu)造器方法、實(shí)例字段
- C#中使用interface關(guān)鍵字定義接口;根據(jù)約定,接口類型名稱以I開頭
- 接口可以從另一個(gè)或多個(gè)接口”繼承“,例:IC繼承IA和IB,則繼承IC的類也要實(shí)現(xiàn)IA和IB中定義的方法,該類也視為實(shí)現(xiàn)了IA和IB
- 派生類不能重寫基類的接口方法(因?yàn)榻涌诜椒ū籆LR標(biāo)記為sealed),但是派生類可以重新繼承同一個(gè)接口,調(diào)用接口方法時(shí)會(huì)調(diào)用在該類上的實(shí)現(xiàn)
- CLR允許定義接口類型的字段、參數(shù)和局部變量,接口類型的變量可以調(diào)用接口中定義的方法;值類型也可以實(shí)現(xiàn)零個(gè)或多個(gè)接口,但是值類型的實(shí)例轉(zhuǎn)換為接口類型時(shí)必須裝箱
- 隱式和顯式接口方法實(shí)現(xiàn)
- 隱式實(shí)現(xiàn):在類中定義一個(gè)和接口方法有相同參數(shù)和返回類型的方法,編譯器自動(dòng)認(rèn)為該方法匹配接口方法,兩個(gè)記錄項(xiàng)(使用類的對(duì)象調(diào)用方法、使用接口類型的對(duì)象調(diào)用方法)將引用同一個(gè)實(shí)現(xiàn)
- 顯式接口方法實(shí)現(xiàn)(EIMI):在類中用接口的名稱作為方法名前綴定義一個(gè)方法,然后直接定義一個(gè)相同簽名的方法,將被視為兩個(gè)方法。
- 例:類MyClass繼承接口IDisposable
- 隱式實(shí)現(xiàn):public void Dispose() {}
- 顯式實(shí)現(xiàn):public void Dispose() {} void IDisposable.Dispose() {}
- myClass.Dispose() 和 ((IDisposable)myClass).Dispose()是有區(qū)別的
- 泛型接口
- 泛型接口提供了編譯時(shí)的類型安全性(使用Object作為參數(shù)可能造成運(yùn)行時(shí)拋出參數(shù)類型異常)
- 使用泛型接口將減少裝箱(使用Object時(shí),傳遞值類型需要裝箱)
- 類可以多次實(shí)現(xiàn)同一個(gè)泛型接口(每次實(shí)現(xiàn)使用不同的類型參數(shù))
- 可以將類型參數(shù)標(biāo)記為協(xié)變和逆變(in、out)
- 泛型和接口約束
- 可以將泛型類型參數(shù)約束為多個(gè)接口(傳遞的參數(shù)類型必須實(shí)現(xiàn)接口)
- 在值類型上調(diào)用接口可以不裝箱
- 實(shí)現(xiàn)多個(gè)具有相同方法名和簽名的接口(兩個(gè)接口中定義了相同名稱和簽名的方法):使用EIMI
- 用EIMI增強(qiáng)編譯時(shí)的類型安全性:例定義CompareTo(Object other)時(shí)用EIMI定義(IComparable.CompareTo(Object other)),然后在類中再定義一個(gè)CompareTo(MyClass other),獲得編譯時(shí)安全性和減少裝箱
- 盡量避免使用EIMI
- 應(yīng)該設(shè)計(jì)類型還是接口
- 類型意味著IS-A關(guān)系,接口意味著CAN-DO關(guān)系
- 從基類派生更簡(jiǎn)單,因?yàn)槔^承接口的類必須實(shí)現(xiàn)所有成員,而派生類型可能只需稍作改動(dòng)
- 接口無法保證所有人百分百正確實(shí)現(xiàn)它,而基類可以默認(rèn)提供一個(gè)良好的實(shí)現(xiàn)
- 向基類添加新方法,派生類型將自動(dòng)繼承;向接口添加新方法,所有繼承者都要添加(現(xiàn)在好像接口也可以提供默認(rèn)實(shí)現(xiàn)了)
- 兩件事情可以同時(shí)做:定義接口,然后定義實(shí)現(xiàn)該接口的基類