亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

C# 接口(Interface)

在人類世界中,兩個(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)方法
    }
}

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

顯式實(shí)現(xiàn)

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

實(shí)現(xiàn)多個(gè)接口

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

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

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

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

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

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

  6. 一個(gè)接口可以繼承一個(gè)或多個(gè)接口。