[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
的類別都必須提供這些成員的具體實現。
為什麼使用介面?
- 抽象化:介面允許我們在不關心具體實現的情況下定義類別應該具備的行為。
- 多重繼承:C#不支援多重繼承,但類別可以實現多個介面,彌補了這一限制。
- 解耦:介面降低了元件之間的耦合度,促進了模組化和可維護性。
- 多態性:介面使我們能夠以統一的方式處理不同的類別。
介面的實現
要實現介面,類別需要提供所有介面成員的具體實現。例如:
public class ConsoleLogger : ILogger
{
public bool IsEnabled { get; set; }
public void Log(string message)
{
if (IsEnabled)
{
Console.WriteLine(message);
}
}
}
在這裡,ConsoleLogger
類別實現了 ILogger
介面,提供了 Log
方法和 IsEnabled
屬性的具體實現。
介面的進階用法
- 介面繼承:介面可以繼承其他介面,從而建立複雜的行為結構。
public interface IRemoteLogger : ILogger
{
void Connect(string url);
}
- 顯式介面實現:當類別實現多個介面且有相同名稱的方法時,可以使用顯式介面實現來區分。
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);
}
}
最佳實踐
- 命名規範:介面的名稱應以大寫字母
I
開頭,例如ILogger
。這有助於區分介面和類別。 - 單一責任原則:每個介面應該只關心單一的職責,避免建立過於龐大的介面。
- 介面隔離原則:應將大介面拆分成多個小介面,使實現類別只依賴它們需要的介面。
結論
介面在C#中作為契約和規範的角色,提供了一種標準化和抽象化的方法來設計程式碼。它們幫助我們提高程式碼的可維護性、可擴展性和靈活性,是實現多態性和解耦合設計的重要工具。通過理解和使用介面,我們可以創建更清晰、結構更合理的程式碼,並且更輕鬆地應對複雜的軟體開發挑戰。