[C#] #4 認識介面(interface) - antqtech/KM GitHub Wiki

C#中的介面(interface),是一個能讓程式碼更具結構性和靈活性的強大工具。介面作為程式設計中的契約和規範,對於建立可擴展和高效的應用程式至關重要。

介面的基礎概念

在C#中,介面是定義一組行為但不具體實現這些行為的抽象型別。它們僅提供方法、屬性、事件和索引子的名稱和簽名,並由實現介面的類別來提供具體實現。介面使用 interface 關鍵字來定義。

public interface ILogger
{
    void Log(string message);
    bool IsEnabled { get; set; }
}

這個範例中,ILogger 介面定義了一個方法 Log 和一個屬性 IsEnabled。所有實現 ILogger 的類別都必須提供這些成員的具體實現。

為什麼使用介面?

  1. 抽象化:介面允許我們在不關心具體實現的情況下定義類別應該具備的行為。
  2. 多重繼承:C#不支援多重繼承,但類別可以實現多個介面,彌補了這一限制。
  3. 解耦:介面降低了元件之間的耦合度,促進了模組化和可維護性。
  4. 多態性:介面使我們能夠以統一的方式處理不同的類別。

介面的實現

要實現介面,類別需要提供所有介面成員的具體實現。例如:

public class ConsoleLogger : ILogger
{
    public bool IsEnabled { get; set; }

    public void Log(string message)
    {
        if (IsEnabled)
        {
            Console.WriteLine(message);
        }
    }
}

在這裡,ConsoleLogger 類別實現了 ILogger 介面,提供了 Log 方法和 IsEnabled 屬性的具體實現。

介面的進階用法

  1. 介面繼承:介面可以繼承其他介面,從而建立複雜的行為結構。
public interface IRemoteLogger : ILogger
{
    void Connect(string url);
}
  1. 顯式介面實現:當類別實現多個介面且有相同名稱的方法時,可以使用顯式介面實現來區分。
public interface IDatabaseLogger
{
    void Log(string message);
}

public class MultiLogger : ILogger, IDatabaseLogger
{
    void ILogger.Log(string message)
    {
        Console.WriteLine("Console log: " + message);
    }

    void IDatabaseLogger.Log(string message)
    {
        Console.WriteLine("Database log: " + message);
    }
}

最佳實踐

  1. 命名規範:介面的名稱應以大寫字母 I 開頭,例如 ILogger。這有助於區分介面和類別。
  2. 單一責任原則:每個介面應該只關心單一的職責,避免建立過於龐大的介面。
  3. 介面隔離原則:應將大介面拆分成多個小介面,使實現類別只依賴它們需要的介面。

結論

介面在C#中作為契約和規範的角色,提供了一種標準化和抽象化的方法來設計程式碼。它們幫助我們提高程式碼的可維護性、可擴展性和靈活性,是實現多態性和解耦合設計的重要工具。通過理解和使用介面,我們可以創建更清晰、結構更合理的程式碼,並且更輕鬆地應對複雜的軟體開發挑戰。