抽象類別與介面並非對立,而是協作關係。抽象類別可部分實現介面,將介面方法映射至 abstract 成員,強制衍生類完成具體實現,形成「契約下沉」的優雅模式。
interface IMethods { void F(); void G(); }
abstract class C : IMethods {
public abstract void F(); // 映射 IMethods.F
public abstract void G(); // 映射 IMethods.G
}
// 所有非抽象衍生類必須 override F/G 提供實現
interface IMethods { void F(); void G(); }
abstract class C : IMethods {
void IMethods.F() => FF(); // 顯式實現
void IMethods.G() => GG();
protected abstract void FF(); // 衍生類實現細節
protected abstract void GG();
}
優勢:介面契約對外不可見(僅能透過 IMethods 引用呼叫),實現細節封裝在 protected 抽象方法中,衍生類聚焦核心邏輯。
abstract 與 override 可共用(表示重寫基類虛方法並保持抽象),但 abstract 不可與 virtual、sealed、static 共用| 場景 | 推薦選擇 | 理由 |
|---|---|---|
| 需要共享實現程式碼 | 抽象類別 | 可包含具體方法、欄位、建構函式 |
| 定義跨層級契約、支援多實現 | 介面 | 類別可實現多介面,介面支援多重繼承 |
| 需要版本演進(新增成員不破壞舊實現) | 介面 + 擴充方法 | C# 8+ default interface methods 或擴充方法 |
| 強制衍生類實現特定演算法骨架 | 抽象類別 + Template Method | 封裝不變流程,延遲可變步驟至 abstract 方法 |
| 介面契約需對外隱藏、僅供內部協作 | 顯式實現 + 抽象類別 | 模式二,實現細節不洩露於公有 API |
實務中常見組合:介面定義契約 → 抽象類別提供骨架/共享邏輯 → 具體類別完成實現,三層分工各司其職。