這篇文章主要為大家展示了“C#如何定義接口”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C#如何定義接口”這篇文章吧。
創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)淮安,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
從技術(shù)上講,接口是一組包含了函數(shù)型方法的數(shù)據(jù)結(jié)構(gòu)。通過(guò)這組數(shù)據(jù)結(jié)構(gòu),客戶代碼可以調(diào)用組件對(duì)象的功能。
定義接口的一般形式為:
[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]
說(shuō)明:
· attributes(可選):附加的定義性信息。
· modifiers(可選):允許使用的修飾符有new和四個(gè)訪問(wèn)修飾符。分別是:new、public、protected、internal、private。在一個(gè)接口定義中同一修飾符不允許出現(xiàn)多次,new修飾符只能出現(xiàn)在嵌套接口中,表示覆蓋了繼承而來(lái)的同名成員。The public, protected, internal, and private修飾符定義了對(duì)接口的訪問(wèn)權(quán)限。
· 指示器和事件。
· identifier:接口名稱。
· base-list(可選):包含一個(gè)或多個(gè)顯式基接口的列表,接口間由逗號(hào)分隔。
· interface-body:對(duì)接口成員的定義。
· 接口可以是命名空間或類的成員,并且可以包含下列成員的簽名: 方法、屬性、索引器 。
· 一個(gè)接口可從一個(gè)或多個(gè)基接口繼承。
接口這個(gè)概念在C#和Java中非常相似。接口的關(guān)鍵詞是interface,一個(gè)接口可以擴(kuò)展一個(gè)或者多個(gè)其他接口。按照慣例,接口的名字以大寫字母"I"開頭。下面的代碼是C#接口的一個(gè)例子,它與Java中的接口完全一樣:
interface IShape { void Draw ( ) ; }
如果你從兩個(gè)或者兩個(gè)以上的接口派生,父接口的名字列表用逗號(hào)分隔,如下面的代碼所示:
interface INewInterface: IParent1, IParent2 { }
然而,與Java不同,C#接口不能包含域(Field)。另外還要注意,在C#中,接口內(nèi)的所有方法默認(rèn)都是公用方法。在Java中,方法定義可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產(chǎn)生一個(gè)編譯錯(cuò)誤。
interface IShape { public void Draw( ) ; }
下面的例子定義了一個(gè)名為IControl 的接口,接口中包含一個(gè)成員方法Paint:
interface IControl { void Paint( ) ; }
在下例中,接口 IInterface從兩個(gè)基接口 IBase1 和 IBase2 繼承:
interface IInterface: IBase1, IBase2 { void Method1( ) ; void Method2( ) ; }
接口可由類實(shí)現(xiàn)。實(shí)現(xiàn)的接口的標(biāo)識(shí)符出現(xiàn)在類的基列表中。例如:
class Class1: Iface1, Iface2 { // class 成員。 }
類的基列表同時(shí)包含基類和接口時(shí),列表中首先出現(xiàn)的是基類。例如:
class ClassA: BaseClass, Iface1, Iface2 { // class成員。 }
以下的代碼段定義接口IFace,它只有一個(gè)方法:
interface IFace { void ShowMyFace( ) ; }
不能從這個(gè)定義實(shí)例化一個(gè)對(duì)象,但可以從它派生一個(gè)類。因此,該類必須實(shí)現(xiàn)ShowMyFace抽象方法:
class CFace:IFace { public void ShowMyFace( ) { Console.WriteLine(" implementation " ) ; } }
基接口
一個(gè)接口可以從零或多個(gè)接口繼承,那些被稱為這個(gè)接口的顯式基接口。當(dāng)一個(gè)接口有比零多的顯式基接口時(shí),那么在接口的定義中的形式為,接口標(biāo)識(shí)符后面跟著由一個(gè)冒號(hào)":"和一個(gè)用逗號(hào)","分開的基接口標(biāo)識(shí)符列表。
接口基:
接口類型列表說(shuō)明:
· 一個(gè)接口的顯式基接口必須至少同接口本身一樣可訪問(wèn)。例如,在一個(gè)公共接口的基接口中指定一個(gè)私有或內(nèi)部的接口是錯(cuò)誤的。
· 一個(gè)接口直接或間接地從它自己繼承是錯(cuò)誤的。
· 接口的基接口都是顯式基接口,并且是它們的基接口。換句話說(shuō),基接口的集合完全由顯式基接口和它們的顯式基接口等等組成。在下面的例子中
interface IControl { void Paint( ) ; } interface ITextBox: IControl { void SetText(string text) ; } interface IListBox: IControl { void SetItems(string[] items) ; } interface IComboBox: ITextBox, IListBox { }
IComboBox 的基接口是IControl, ITextBox, 和 IlistBox。
· 一個(gè)接口繼承它的基接口的所有成員。換句話說(shuō),上面的接口IComboBox就像Paint一樣繼承成員SetText 和 SetItems。
· 一個(gè)實(shí)現(xiàn)了接口的類或結(jié)構(gòu)也隱含地實(shí)現(xiàn)了所有接口的基接口。
接口主體
一個(gè)接口的接口主體定義接口的成員。
interface-body: { interface-member-declarationsopt }
定義接口成員
接口可以包含一個(gè)和多個(gè)成員,這些成員可以是方法、屬性、索引指示器和事件,但不能是常量、域、操作符、構(gòu)造函數(shù)或析構(gòu)函數(shù),而且不能包含任何靜態(tài)成員。接口定義創(chuàng)建新的定義空間,并且接口定義直接包含的接口成員定義將新成員引入該定義空間。
說(shuō)明:
· 接口的成員是從基接口繼承的成員和由接口本身定義的成員。
· 接口定義可以定義零個(gè)或多個(gè)成員。接口的成員必須是方法、屬性、事件或索引器。接口不能包含常數(shù)、字段、運(yùn)算符、實(shí)例構(gòu)造函數(shù)、析構(gòu)函數(shù)或類型,也不能包含任何種類的靜態(tài)成員。
· 定義一個(gè)接口,該接口對(duì)于每種可能種類的成員都包含一個(gè):方法、屬性、事件和索引器。
· 接口成員默認(rèn)訪問(wèn)方式是public。接口成員定義不能包含任何修飾符,比如成員定義前不能加abstract,public,protected,internal,private,virtual,override 或static 修飾符。
· 接口的成員之間不能相互同名。繼承而來(lái)的成員不用再定義,但接口可以定義與繼承而來(lái)的成員同名的成員,這時(shí)我們說(shuō)接口成員覆蓋了繼承而來(lái)的成員,這不會(huì)導(dǎo)致錯(cuò)誤,但編譯器會(huì)給出一個(gè)警告。關(guān)閉警告提示的方式是在成員定義前加上一個(gè)new關(guān)鍵字。但如果沒有覆蓋父接口中的成員,使用new關(guān)鍵字會(huì)導(dǎo)致編譯器發(fā)出警告。
· 方法的名稱必須與同一接口中定義的所有屬性和事件的名稱不同。此外,方法的簽名必須與同一接口中定義的所有其他方法的簽名不同。
· 屬性或事件的名稱必須與同一接口中定義的所有其他成員的名稱不同。
· 一個(gè)索引器的簽名必須區(qū)別于在同一接口中定義的其他所有索引器的簽名。
· 接口方法聲明中的屬性(attributes), 返回類型(return-type), 標(biāo)識(shí)符(identifier)和形式參數(shù)列表(formal-parameter-lis)與一個(gè)類的方法聲明中的那些有相同的意義。一個(gè)接口方法聲明不允許指定一個(gè)方法主體,而聲明通常用一個(gè)分號(hào)結(jié)束。
· 接口屬性聲明的訪問(wèn)符與類屬性聲明的訪問(wèn)符相對(duì)應(yīng),除了訪問(wèn)符主體通常必須用分號(hào)。因此,無(wú)論屬性是讀寫、只讀或只寫,訪問(wèn)符都完全確定。
· 接口索引聲明中的屬性(attributes),類型(type)和形式參數(shù)列表(formal-parameter-list)與類的索引聲明的那些有相同的意義。
下面例子中接口IMyTest包含了索引指示器、事件E、方法F、屬性P這些成員:
interface IMyTest{ string this[int index] { get; set; } event EventHandler E ; void F(int value) ; string P { get; set; } } public delegate void EventHandler(object sender, EventArgs e) ;
下面例子中接口IStringList包含每個(gè)可能類型成員的接口:一個(gè)方法,一個(gè)屬性,一個(gè)事件和一個(gè)索引。
public delegate void StringListEvent(IStringList sender); public interface IStringList { void Add(string s); int Count { get; } event StringListEvent Changed; string this[int index] { get; set; } }
接口成員的全權(quán)名
使用接口成員也可采用全權(quán)名(fully qualified name)。接口的全權(quán)名稱是這樣構(gòu)成的。接口名加小圓點(diǎn)"." 再跟成員名比如對(duì)于下面兩個(gè)接口:
interface IControl { void Paint( ) ; } interface ITextBox: IControl { void GetText(string text) ; }
其中Paint 的全權(quán)名是IControl.Paint,GetText的全權(quán)名是ITextBox. GetText。當(dāng)然,全權(quán)名中的成員名稱必須是在接口中已經(jīng)定義過(guò)的,比如使用ITextBox.Paint.就是不合理的。
如果接口是名字空間的成員,全權(quán)名還必須包含名字空間的名稱。
namespace System { public interface IDataTable { object Clone( ) ; } }
那么Clone方法的全權(quán)名是System. IDataTable.Clone。
定義接口完成后,之后我們關(guān)心的就是怎樣實(shí)現(xiàn)對(duì)C#接口的訪問(wèn)。
以上是“C#如何定義接口”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!