在人類世界中,兩個(gè)或兩個(gè)以上的人之間的契約約束他們按照契約行事。同樣,接口包括相關(guān)功能的聲明。實(shí)現(xiàn)接口的實(shí)體必須提供聲明功能的實(shí)現(xiàn)。
在C#中,可以使用 interface 關(guān)鍵字定義接口。接口可以包含方法,屬性,索引器和事件的聲明。但是,它不能包含字段,自動(dòng)實(shí)現(xiàn)的屬性。
以下接口聲明了文件操作的一些基本功能。
interface IFile { void ReadFile(); void WriteFile(string text); }
您不能將訪問(wèn)修飾符應(yīng)用于接口成員。默認(rèn)情況下,所有成員都是公開(kāi)的。如果在接口中使用訪問(wèn)修飾符,則C#編譯器將給出編譯時(shí)錯(cuò)誤“The modifier 'public/private/protected' is not valid for this item.”。(Visual Studio將立即顯示錯(cuò)誤而不進(jìn)行編譯。)
interface IFile { protected void ReadFile(); //編譯時(shí)錯(cuò)誤 private void WriteFile(string text);//編譯時(shí)錯(cuò)誤 }
接口只能包含聲明,而不能包含實(shí)現(xiàn)。以下將給出編譯時(shí)錯(cuò)誤。
interface IFile { void ReadFile(); void WriteFile(string text){ Console.Write(text); //錯(cuò)誤:無(wú)法實(shí)現(xiàn)方法 } }
一個(gè)類或一個(gè)Struct可以使用冒號(hào)(:)實(shí)現(xiàn)一個(gè)或多個(gè)接口。
語(yǔ)法:
<Class or Struct Name> : <Interface Name>
例如,下面的類隱式地實(shí)現(xiàn)了 IFile 接口。
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { public void ReadFile() { Console.WriteLine("Reading File"); } public void WriteFile(string text) { Console.WriteLine("Writing to file"); } }
在上面的示例中,F(xiàn)ileInfo 類實(shí)現(xiàn)了 IFile 接口。它使用 public 訪問(wèn)修飾符定義 IFile 接口的所有成員。FileInfo 類還可以包含接口成員以外的其他成員。
接口成員必須使用 public 修飾符實(shí)現(xiàn);否則,編譯器將給出編譯時(shí)錯(cuò)誤。
您可以創(chuàng)建該類的對(duì)象,并將其分配給接口類型的變量,如下所示。
public class Program { public static void Main() { IFile file1 = new FileInfo(); FileInfo file2 = new FileInfo(); file1.ReadFile(); file1.WriteFile("content"); file2.ReadFile(); file2.WriteFile("content"); } }
上面,我們創(chuàng)建了 FileInfo 類的對(duì)象,并將其分配給 IFile 類型變量和 FileInfo 類型變量。當(dāng)接口隱式實(shí)現(xiàn)時(shí),您可以使用 IFile 類型變量以及 FileInfo 類型變量訪問(wèn) IFile 成員。
接口可以使用<InterfaceName>.<MemberName>來(lái)顯式實(shí)現(xiàn)。 當(dāng)類正在實(shí)現(xiàn)多個(gè)接口時(shí),顯式實(shí)現(xiàn)是有用的;因此,它更易于讀,并消除了混亂。 如果接口具有相同的方法名,那么它也是有用的。
不要將 public 修飾符與顯式實(shí)現(xiàn)一起使用。它將給出一個(gè)編譯時(shí)錯(cuò)誤。
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { void IFile.ReadFile() { Console.WriteLine("Reading File"); } void IFile.WriteFile(string text) { Console.WriteLine("Writing to file"); } }
顯式實(shí)現(xiàn)接口時(shí),只能通過(guò)接口類型的實(shí)例訪問(wèn)接口成員。
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { void IFile.ReadFile() { Console.WriteLine("Reading File"); } void IFile.WriteFile(string text) { Console.WriteLine("Writing to file"); } public void Search(string text) { Console.WriteLine("Searching in file"); } } public class Program { public static void Main() { IFile file1 = new FileInfo(); FileInfo file2 = new FileInfo(); file1.ReadFile(); file1.WriteFile("content"); //file1.Search("text to be searched")//編譯時(shí)錯(cuò)誤 file2.Search("text to be searched"); //file2.ReadFile(); //編譯時(shí)錯(cuò)誤 //file2.WriteFile("content"); //編譯時(shí)錯(cuò)誤 } }
在上面的示例中,file1對(duì)象只能訪問(wèn)的成員IFile,并且file2只能訪問(wèn)FileInfo類的成員。這是顯式實(shí)現(xiàn)的局限性。
一個(gè)類或結(jié)構(gòu)可以實(shí)現(xiàn)多個(gè)接口。它必須提供所有接口的所有成員的實(shí)現(xiàn)。
interface IFile { void ReadFile(); } interface IBinaryFile { void OpenBinaryFile(); void ReadFile(); } class FileInfo : IFile, IBinaryFile { void IFile.ReadFile() { Console.WriteLine("Reading Text File"); } void IBinaryFile.OpenBinaryFile() { Console.WriteLine("Opening Binary File"); } void IBinaryFile.ReadFile() { Console.WriteLine("Reading Binary File"); } public void Search(string text) { Console.WriteLine("Searching in File"); } } public class Program { public static void Main() { IFile file1 = new FileInfo(); IBinaryFile file2 = new FileInfo(); FileInfo file3 = new FileInfo(); file1.ReadFile(); //file1.OpenBinaryFile(); //編譯時(shí)錯(cuò)誤 //file1.SearchFile("text to be searched"); //編譯時(shí)錯(cuò)誤 file2.OpenBinaryFile(); file2.ReadFile(); //file2.SearchFile("text to be searched"); //編譯時(shí)錯(cuò)誤 file3.Search("text to be searched"); //file3.ReadFile(); //編譯時(shí)錯(cuò)誤 //file3.OpenBinaryFile(); //編譯時(shí)錯(cuò)誤 } }
上面,F(xiàn)ileInfo實(shí)現(xiàn)了兩個(gè)接口,IFile和IBinaryFile顯式實(shí)現(xiàn)。建議在實(shí)現(xiàn)多個(gè)接口時(shí)顯式實(shí)現(xiàn)接口,以避免混淆和提高可讀性。
接口可以包含方法,屬性,索引器和事件的聲明。
接口不能包含私有成員,受保護(hù)成員或內(nèi)部成員。默認(rèn)情況下,所有成員都是公開(kāi)的。
接口不能包含字段和自動(dòng)實(shí)現(xiàn)的屬性。
類或結(jié)構(gòu)可以隱式或顯式實(shí)現(xiàn)一個(gè)或多個(gè)接口。在隱式實(shí)現(xiàn)接口時(shí)使用public修飾符,而在顯式實(shí)現(xiàn)的情況下請(qǐng)勿使用它。
使用 InterfaceName. MemberName 顯式實(shí)現(xiàn)接口。
一個(gè)接口可以繼承一個(gè)或多個(gè)接口。