C# 採單一繼承模型,類別僅能繼承一個基底類別,但可實作多個介面。這在設計上帶來不便:當一個類別需結合多個介面的預設實作時,傳統做法只能選擇一個抽象類別繼承,其餘介面需手動實作。C# 3.0 引入的擴展方法為此提供了一種創新的替代方案——「受限的多重繼承」。
擴展方法允許在靜態類別中定義靜態方法,並透過 this 修飾第一個參數,使其彷彿成為該型別的實例方法。關鍵在於:擴展方法可以針對介面定義,從而為介面成員提供具體實作,而無須建立實作類別。
public interface ITestA { }
public static class ITestAHelper
{
public static void TestA(this ITestA obj)
{
Console.WriteLine("ITestAHelper.TestA");
}
}
public interface ITestB { }
public static class ITestBHelper
{
public static void TestB(this ITestB obj)
{
Console.WriteLine("ITestBHelper.TestB");
}
}
public class Test : ITestA, ITestB { }
現在 Test 類別的實例即可同時呼叫 TestA() 與 TestB(),達到類似多重繼承的效果:
Test obj = new Test();
obj.TestA(); // 輸出: ITestAHelper.TestA
obj.TestB(); // 輸出: ITestBHelper.TestB
然而,這種模擬存在嚴重缺陷:
Test 定義了 TestA(),則 obj.TestA() 呼叫的是類別方法,而非擴展方法。即使強制轉型 ((ITestA)obj).TestA(),仍呼叫類別方法(因為編譯器解析優先順序)。virtual:靜態方法不支援虛擬機制,因此無法被衍生類別覆寫,徹底斷送了多型可能。void TestA(),則擴展方法永遠無法透過介面參考呼叫。此模式適用於:
IEnumerable<T> 擴展方法)。若需真正的多型與程式碼重用,仍應採用組合或策略模式,或在 C# 8.0+ 使用介面預設實作(Default Interface Methods) —— 這才是語言層面正統解決方案。