C# 不支援類別多重繼承,但可透過「介面 + 擴展方法」組合,達到類似多重繼承的程式碼復用效果。本文說明核心概念、完整範例,並分享作者從 Entity Framework 實體類別重構到貧血模型的實戰心路歷程。
public interface IMyInterface { void MethodB(); }
public static class Extensions {
// 擴展介面,提供預設實作
public static void MethodB(this IMyInterface myInterface) {
Console.WriteLine("Extensions.MethodB");
}
}
所有實作 IMyInterface 的類別(A、B、C)無需自行實作 MethodB,即可直接呼叫 a.MethodB(),執行擴展方法提供的共用邏輯。
using System;
namespace ExtensionMethodsDemo1
{
public interface IMyInterface { void MethodB(); }
class A : IMyInterface { }
class B : IMyInterface { }
class C : IMyInterface { }
public static class Extensions
{
public static void MethodB(this IMyInterface myInterface)
{
Console.WriteLine("Extension.MethodB(this IMyInterface myInterface)");
}
}
class ExtMethodDemo
{
static void Main()
{
new A().MethodB(); // 輸出擴展方法內容
new B().MethodB();
new C().MethodB();
}
}
}
EntityObject(已有父類別),無法再繼承基類。CopyFrom 複製屬性邏輯。IModelMother 定義契約,但介面無法包含實作。| 優點 | 缺點 |
|---|---|
| 無需多重繼承即可共用實作 | 擴展方法為靜態,無法存取介面未公開的私有狀態 |
| 介面保持單純契約,符合 ISP 原則 | 無法像基類那樣擁有建構函式、欄位初始化 |
| 新增共用行為不修改既有類別(OCP) | IDE 智慧感應顯示為擴展方法,非實例方法 |
「介面定義契約,擴展方法提供預設實作」是 C# 實現類 Mixin(混入)模式的標準做法。C# 8.0 介面預設實作(default)進一步原生支援此模式,但擴展方法仍具備「不修改介面定義即可擴展」的優勢,適合第三方介面或跨組件擴展場景。