在人類世界中,兩個(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è)接口。