接口
可以理解成由于c#不支持多繼承,于是出現(xiàn)了接口用來規(guī)定有相同特性的派生類;而接口就像是一個標(biāo)準(zhǔn),符合標(biāo)準(zhǔn)的才能夠與接口對接。
實現(xiàn)接口的任何類或結(jié)構(gòu)必須實現(xiàn)其所有成員的方法。
接口不能直接實例化,但是可以通過指向子類間接實例化。
接口可以包含方法和屬性的聲明,但不能包含字段。
接口中所有方法、屬性默認(rèn)為public,不能在后面再添加修飾符。
類或結(jié)構(gòu)可以實現(xiàn)多個接口。 類可以繼承基類并實現(xiàn)一個或多個接口。
接口里可以實現(xiàn)方法的重載
接口和抽象類
接口與抽象類非常相似,它定義了一些未實現(xiàn)的屬性和方法。所有繼承它的類都繼承這些成員,在這個角度上,可以把接口理解為一個類的模板。接口最終的目的是起到統(tǒng)一的作用。
兩者都包含可以由子類繼承的抽象成員;
兩者都不直接實例化。
抽象類除擁有抽象成員之外,還可以擁有非抽象成員;而接口所有的成員都是抽象的。
抽象成員可以是私有的,而接口的成員默認(rèn)是公有的。
接口中不能含有構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員和常量。
C#只支持單繼承,即子類只能繼承一個父類,而一個子類卻能夠?qū)崿F(xiàn)多個接口。
泛型
C#中的泛型能夠?qū)㈩愋妥鳛閰?shù)來傳遞,即在創(chuàng)建類型時用一個特定的符號如“T”來作為一個占位符,代替實際的類型,等待在實例化時用一個實際的類型來代替。
pubic class Test<T>{
????????public void Swap(T a,T b){
????????}
}
實例化時直接申明需要的參數(shù)類型
Test <string> t =new Test<string>();
t.swap("as","sd");
例二:
public class Test<T,U>{
public void swap(T a, U b){ ? ?}?
}
實例化:
Test<string ,int> t=new Test<string, int>();
t.swap("one",1)
使用情況為:
經(jīng)常遇到兩個模塊的功能非常相似,只是一個是處理int數(shù)據(jù),另一個是處string數(shù)據(jù)(不同的數(shù)據(jù)類型),或者其他自定義的數(shù)據(jù)類型
優(yōu)點:
一、使用泛型類型可以最大限度地重用代碼、保護(hù)類型的安全以及提高性能。(重用代碼既是保護(hù)代碼安全的一種方式)
二、降低了強制轉(zhuǎn)換或裝箱操作的成本或風(fēng)險。
三、可以對泛型類進(jìn)行約束以訪問特定數(shù)據(jù)類型的方法。
約束
在定義泛型類時,可以對客戶端代碼能夠在實例化類時用于類型參數(shù)的類型種類施加限制。 如果客戶端代碼嘗試使用某個約束所不允許的類型來實例化類,則會產(chǎn)生編譯時錯誤。 這些限制稱為約束。 約束是使用 where 上下文關(guān)鍵字指定的。
public class Test<T> where T:struct{};//值類型
public class Test where T:class{};//引用類型