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