C# 接口(Interface)

在人類世界中,兩個或兩個以上的人之間的契約約束他們按照契約行事。同樣,接口包括相關(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)方法
    }
}

實現(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 成員。

顯式實現(xiàn)

接口可以使用<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)的局限性。

實現(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)接口,以避免混淆和提高可讀性。

要記住的要點:
  1. 接口可以包含方法,屬性,索引器和事件的聲明。

  2. 接口不能包含私有成員,受保護成員或內(nèi)部成員。默認情況下,所有成員都是公開的。

  3. 接口不能包含字段和自動實現(xiàn)的屬性。

  4. 類或結(jié)構(gòu)可以隱式或顯式實現(xiàn)一個或多個接口。在隱式實現(xiàn)接口時使用public修飾符,而在顯式實現(xiàn)的情況下請勿使用它。

  5. 使用 InterfaceName. MemberName 顯式實現(xiàn)接口。

  6. 一個接口可以繼承一個或多個接口。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清