c#中的介面
在c#中介面是一組公共方法或屬性的集合。介面可以被其他介面或是類繼承,但不能被例項化。
1、介面中包含的屬性和方法都是公共的,不是繼承或是私有的。事實上,在c#中定義介面中的成員時,不允許顯示指定介面成員的可訪問性,而是自動預設為公共的。
2、介面中只能包含普通方法或屬性,而不能包含其他內容,如建構函式、變數等。
3、當介面被某個類繼承時,通常說類實現了這個介面,而較少說類繼承了介面。
4、介面中的方法和屬性只有簽名部分,而沒有實現部分,甚至連線口名後面的大括號也不能有,否則會出現編譯錯誤。
在c#中用inte***ce關鍵字定義乙個介面
訪問修飾符 inte***ce 介面名
c#中約定介面的名字以字母i開頭。如以下**定義乙個介面iperson
1public
inte***ce
iperson
211 }
如前所述,介面中不允許定義變數、建構函式,不能顯示指定介面中方法或屬性的可訪問性。
介面可以被類或者別的介面繼承。類繼承介面的語法與類繼承類的語法相同,都是在類名後面加冒號和要繼承的介面名,如下:
訪問修飾符 class 類名:介面名
類繼承介面與類繼承類的不同之處在於乙個類可以同時繼承多個介面,但只能從乙個類繼承。當乙個類繼承多個介面時,多個介面之間用逗號隔開,如下:
訪問修飾符 class 類名:[基類名][,介面1][,介面2][...][,介面n]
介面繼承介面與類繼承介面語法類似,只是定義介面時使用關鍵字inte***ce。
訪問修飾符 inte***ce 介面名:[介面1][,介面2][,介面3][...][,介面n]
如果乙個類從介面繼承,那麼這個類必須要實現介面中定義的所有方法和屬性。由於介面定義了方法和屬性的簽名,而這些方法和屬性的具體實現**是在從介面繼承的類裡寫,所以當乙個類從介面繼承時,通常說乙個類實現了某個介面。
這裡所說的實現有兩層含義:首先說明類繼承於介面,其次,類中用**實現了介面中定義的方法和屬性。
如果乙個類實現了乙個介面,由於類繼承自介面,所以類可以隱式轉換為介面,這與派生類向基類隱式轉換是一樣的。如果乙個類實現了多個介面,那麼類可以隱式轉換為其中任意乙個介面。
1public
inte***ce
iperson211
}1213public
class
student:iperson
1420
21public
void speak(string
text)
2225
26private
string
_name;
27public
string
name
2833
set3437}
38}39static
void main(string
args)
40
結果
main: 通過介面呼叫方法nick say: hello
main: 通過類呼叫方法
jessice eat: rice
jessice say: hehe
顯式介面的實現
使用顯式介面時,類中用來實現介面的方法名前面必須以介面名作為字首。
1public
class
newstudent:iperson28
9void iperson.speak(string
text)
1013
14private
string
_name;
15string
iperson.name
1621
set2225}
26}27static
void main(string
args)
28
執行結果
main: 通過介面呼叫方法nick say: hello
main: 通過類呼叫方法
jessice eat: rice
jessice say: hehe
顯式介面示例
jason eat: bread
jason say: good luck!
在顯式實現介面時,newstudent類中對應於iperson介面的方法(或屬性)名都有iperson做字首,而且方法(或屬性)不允許有public、protected等訪問修飾符。當乙個類顯式實現介面時,類中用於實現介面的方法只能通過介面
來呼叫,而不能通過介面的例項來呼叫。
介面與抽象類的對比
介面與抽象類有相似之處,兩者都可以定義一組屬性和方法,都不能被建立例項,只能用作別的類的基類。但介面與抽象類有很大不同之處,如下:
1、在抽象類中可以定義變數,而在介面中不可以
2、在抽象類中可以定義建構函式,而介面中不可以
3、在抽象類中可以定義非公共成員,如protected、private、internal等級的方法變數等,介面中只能定義public的成員
4、抽象類中的非抽象方法可以有方法體,而介面中的方法只能有定義,不能有實現
5、由於c#類只能單繼承,所以一旦乙個類繼承了某個抽象類,那麼就無法繼承其他抽象類了。也就是說,抽象類的繼承具有唯一性和排他性。而從介面繼承卻不存在這個問題。乙個類繼承某個介面,不影響這個類在繼承其他介面
綜上,在介面中只能定義public訪問級別的方法簽名和屬性簽名,而抽象類除了不能生成類的例項外,其餘的行為與普通類相同,能在普通類中定義的所有成員,都可以在抽象類中定義。抽象類中的方法允許定義實現**,從而可以
把派生類中的公共**放在抽象類中,實現**復用,減少派生類的編碼量。
介面與抽象類例子如下:
1inte***ce
iperson211
}1213public
abstract
class
person
1419
20public
void speak(string
text)
2124
25private
string
_name;
26public
string
name
2729
set 30}
31}3233
public
class
child1:iperson
3440
41public
void speak(string
text)
4245
46private
string
_name;
47public
string
name
4853
set5457}
5859
public
void
study()
6063}64
65public
class
adult1:iperson
6671
72public
void speak(string
text)
7376
77private
string
_name;
78public
string
name
7984
set8588}
8990
public
void
work()
9194}95
96public
class
child2:person
97102
}103
104public
class
adult2:person
105110
}111
112static
void main(string
args)
113
執行結果
jack say: hello
jack study hard.....
nick say: hello
nick work hard....
lucy eat: rice
lucy say: hello
lucy study hard....
lily eat: banana
lily say: hello
lily work hard...
從child1和adult1類的實現**來看,兩個類都繼承自iperson,為了實現介面中定義的方法,相同的**在兩個類中寫了兩遍。
從person、child2和adult2類**可以看出,在person中實現了方法和屬性,不用再派生類中重複實現,實現了**的復用。
C 基本語法學習(六)
抽象類和密封類 在定義類時可以使用abstract關鍵字宣告這個類是抽象的。抽象類不能被例項化,即不能建立抽象類的例項。抽象類的主要作用是充當其他類的基類。密封類的概念剛好與抽象類相對,這種類不能充當別的類的基類。密封 的概念是不可以從這個類派生出別的類。在定義類時用sealed關鍵字指明類是密封的...
c 語法學習
迴圈和關係表示式 for迴圈 表示式和語句 遞增和遞減,字首式效率更高 組合賦值操作符 復合語句 逗號操作符 關係操作符,和 while迴圈 typedef工具 dowhile迴圈 get 字元輸入方法 檔案尾條件 巢狀迴圈和二維數值 strcmp a,b 判斷兩個字串是否相等 cin如何處理字元輸...
C 基礎語法學習
基本用語區分 解決方案和專案 解決一類問題的方案。比如要建一套房子是不是要有一套解決方案,那是不是要把該方案分解成幾個小專案,如設計,裝修,水電安裝,材料運輸等專案 c 和.net net 是一種平台一種技術,裡面包含著乙個非常大的 庫 可以模擬成 jvm c 是一種語言,我們可以使用c 去呼叫.n...