剛學完繼承,得知繼承用於建立可重用,擴充套件和修改在其他類中定義的行為的新類。但是我們發現繼承只能單繼承,生活中我們會發現不是所有的事物都具有該類事物普遍的功能,比如,喜鵲鸚鵡會飛,但鴕鳥企鵝不會飛。這時候繼承雖然可以解決這類問題,但不是最好的,我們通過另一種方式能夠跟好的解決上述問題,那就是介面。
介面和類是同級的,ta和類非常相似,所以ta也是應用型別。
使用介面有幾個注意點:
1.介面的關鍵字是inte***ce,通常所有的介面以大寫i開頭後面使用駝峰法
2.介面中的方法是不實現的,介面中的方法都是public,我們不能去使用訪問修飾符,介面中不能包含字段
3.當乙個類繼承了介面,那麼這個類必須實現介面中的所有方法,除非繼承的類是乙個抽象類或還是乙個介面
我們先隨意定義兩個介面:
inte***ce
ifly
inte***ce
ispeak
當乙個介面繼承多個介面之後,那麼這個介面相當於擁有了ta所有繼承的方法宣告。如果某個類繼承了這個介面,那麼ta不僅僅要實現這個介面中的內容,也要實現這個介面所繼承的介面中的內容。介面和繼承相似,也是寫在類名後面,介面與介面之間以逗號隔開。如果這個類有繼承,那麼介面必須寫在基類的後面,因為基類只有乙個,而介面可以有多個。例如:
inte***ce
ikun
:ifly
, ispeak
class
bird
:ikun
public
void
fly(
)public
void
speak()
}
介面的特性:
1.介面是乙個引用型別,只包含了功能的定義,不包含功能的實現
2.c#介面成員的訪問級別是預設的(預設為public),不可以使用其他修飾詞修飾
3.c#介面成員不能有static,abstract,override,virtual修飾
4.介面一旦被實現,就必須實現介面當中的所有成員,除非實現類本身是抽象類
5.介面無法直接進行例項化,因為其成員必須通過由實現介面的任何類或結構來實現
6.介面可以包含事件,索引器,方法和屬性,但是不能包含字段
7.類的繼承只能單繼承,介面的實現支援多實現
8.介面中方法的定義不允許加上訪問修飾符,預設修飾符為public
9.類實現介面就必須實現介面當中定義的所有方法,除非該類是抽象類
介面與抽象類非常相似,它們之間有共同點:
1.兩者都不能被例項化
2.兩者都包含了由其他類或結構繼承或實現的抽象成員
也有不同點:
1.抽象類當中除了擁有抽象成員外還可以擁有非抽象成員;而介面中所有的所有成員都是抽象的
2.抽象成員可以使用修飾符修飾,介面當中介面成員訪問級別是預設不可修改的,並且預設是public
3.介面當中不可以包含構造方法,析構方法,靜態成員以及常量
4.c#類只支援單繼承,介面支援多支援
我們在編寫程式的時候經常會遇到兩個模組的功能非常相似,只是因為引數型別不同,所以分寫成多個方法處理每種資料型別。例如:
public
void
add(
int a,
int b)
public
void
add(
double a,
double b)
public
void
add(
string a,
string b)
//我們可以採用根類object,來解決這個問題
public
void
newadd
(object a,
object b)
object可以是任意型別,根據我們所寫的引數不同,ta會自動識別型別,但是有缺陷,會有裝箱和拆箱的操作,對效能造成非常大的影響。因此我們引入了泛型,在方法的後面加乙個類似引數的(型別引數),這個引數代表我們在使用的時候填寫什麼型別,ta就是什麼型別。
public
void
swap
<
t>
(ref
t a,
reft b)
//t代表型別佔位符
//乙個方法可以有多個泛型型別的引數
public
void
print
v>
(t a,
v b)
泛型的優點:
1.使用泛型可以的重用**,保護型別的安全以及提高效能
2.降低強制轉換或裝箱操作的成本和風險
3.可以對泛型引數進行限定以訪問特定資料型別的方法
在泛型型別或方法定義中,型別引數是客戶端在例項化泛型型別的變數時指定的特定型別的佔位符。在上面例子泛型方法當中t即為泛型型別引數。
泛型型別引數注意點:
1.泛型型別引數可以有多個
2.泛型型別引數可以是編譯器識別的任何資料型別
3.泛型型別引數命名需要遵守命名規則
(1)使用描述性名稱命名泛型型別,並且使用t作為字首
(2)單個字母名稱完全可以讓人了解其表示的含義使用單個大寫字母命名
泛型型別引數常用的約束型別
where t:struct :表示泛型t是值型別(小數,整數,char,bool,struct)
where t:class :表示泛型t是引用型別
where t:new() :表示這個泛型具有乙個無引數的構造方法,如果有多個約束,new()必須放在最後
where t:基類名 :表示這個泛型是該基類或者其派生類
where t:介面名 :表示泛型是實現了該介面的型別
注意:指定泛型型別t必須是乙個值型別,不能同時新增struct和class約束
public
void
add2
<
t>
(t a,
t b)
where t :
struct
格式:訪問修飾符 返回值型別 方法名《泛型型別引數》(引數列表)
呼叫泛型方法:物件/類.方法名《具體型別》(實參)
泛型類封裝了不是特定於具體資料型別的操作,當類中存在未知引數型別的時候就可以使用泛型類
格式:修飾符 class 類名《泛型型別引數》
例如:
class
student
public
void
eat(
t a,
v b)
}
C 泛型類與介面
1 泛型類 using system using system.collections using system.collections.generic 泛型類 class ttt class program p1.name console.writeline p2 p2.name 2 泛型介面 u...
c 泛型介面
使用泛型可以定義介面,在介面中定義的方法可以帶泛型引數。public inte ce a t method t t 1.協變和抗變 net4通過協變和抗變為泛型介面和泛型委託新增了乙個重要的擴充套件。協變和抗變指對引數和返回值的型別進行轉換。在 net 中,引數型別是協變的。假定有 shape 和r...
泛型 泛型介面
泛型介面 介面上要宣告泛型,介面的抽象方法要接這個泛型。實現類的宣告也要寫具體的泛型實參。注意 泛型實參要用引用資料型別。基本資料型別不行。如果一定要使用基本資料型別那麼得使用基本資料型別的包裝類。如果實現類中的型別不確定,也想帶泛型,並且和介面中的一致。那麼在實現類中宣告,將在此處宣告的 類的泛型...