在 C# 開發中,類別實作介面時有兩種寫法:隱式實作與顯式實作。許多初學者對此感到困惑,甚至以為兩者效果相同。實際上,它們在存取層級、多介面衝突處理以及呼叫方式上有本質不同。本文將透過程式碼範例深入解析兩者的差異,並說明何時應使用哪一種。
interface IPrintable
{
void Print();
}
class Printer : IPrintable
{
// 寫法一:隱式實作
public void Print()
{
Console.WriteLine("隱式實作");
}
// 寫法二:顯式實作
void IPrintable.Print()
{
Console.WriteLine("顯式實作");
}
}
public 修飾詞,否則編譯錯誤。Printer p = new Printer();
p.Print(); // 呼叫隱式實作
IPrintable ip = p;
ip.Print(); // 呼叫顯式實作(若兩者並存,介面型別呼叫顯式實作)
若類別同時實作兩種寫法,透過類別實例呼叫會執行隱式實作;透過介面參考呼叫則執行顯式實作。
這是顯式實作最重要的用途。當類別實作多個介面,且這些介面擁有相同名稱、相同簽章的方法時,隱式實作只能有一個方法本體,無法分別處理不同介面的邏輯。
interface IA { void DoWork(); }
interface IB { void DoWork(); }
class MyClass : IA, IB
{
// 隱式實作:IA 和 IB 共用這個方法
public void DoWork() { Console.WriteLine("共用邏輯"); }
// 顯式實作:分別為 IA、IB 提供獨立邏輯
void IA.DoWork() { Console.WriteLine("IA 專屬邏輯"); }
void IB.DoWork() { Console.WriteLine("IB 專屬邏輯"); }
}
此時,若透過 IA 或 IB 型別呼叫 DoWork(),將執行對應的顯式實作;若透過 MyClass 實例呼叫,則執行隱式實作(若存在)。
IDisposable 時,通常顯式實作 Dispose(),避免使用者直接呼叫)。理解隱式與顯式實作的差異,能幫助你設計更清晰、更具彈性的類別架構。記住:隱式實作給類別用,顯式實作給介面用。遇到多介面衝突或需封裝內部實作時,顯式實作是標準解法。