在 C# 物件導向設計中,base 關鍵字是衍生類別與基類別溝通的專屬通道。它不像 this 指向自身,而是精準指向「父類別」的實作細節。無論是方法覆寫時的協作、建構子鏈結的初始化,還是 Entity Framework 等框架內部的慣用模式,base 都扮演著不可取代的角色。本文將系統梳理其三大核心應用場景。
當衍生類別使用 override 覆寫虛擬方法時,若仍需保留基類別的原始邏輯,必須透過 base.方法名() 顯式呼叫。這符合「開放封閉原則」——對擴充開放,對修改封閉。
public class Father
{
public virtual void Say()
{
Console.WriteLine("Father Say");
}
}
public class Son : Father
{
public override void Say()
{
base.Say(); // 先執行父類邏輯
Console.WriteLine("Son Say"); // 再執行自身擴充邏輯
}
}
var son = new Son();
son.Say();
// 輸出:
// Father Say
// Son Say
設計模式連結: 這是「模板方法模式」在語言層面的直接支援——基類別定義演算法骨架,衍生類別透過 base 參與特定步驟。
衍生類別實例化時,會自動呼叫基類別的無參數建構子。若基類別僅提供帶參數建構子,或需傳遞特定參數,必須在衍生類別建構子後使用 base(參數列表) 顯式指定。
public class Father
{
public string Name { get; set; }
public Father(string name)
{
Name = name;
Console.WriteLine($"Father 建構子執行,Name = {Name}");
}
}
public class Son : Father
{
public int Age { get; set; }
// 必須顯式呼叫 base(name),否則編譯錯誤
public Son(string name, int age) : base(name)
{
Age = age;
Console.WriteLine($"Son 建構子執行,Age = {Age}");
}
}
var son = new Son("John", 25);
// 輸出:
// Father 建構子執行,Name = John
// Son 建構子執行,Age = 25
關鍵規則: base() 必須是建構子初始化器的第一條陳述式,且每個建構子只能呼叫一個 base()。若基類別有無參數建構子,衍生類別可省略 base()(編譯器自動插入)。

在 EF Core 開發中,自訂 DbContext 衍生類別時,標準模式為:
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options)
: base(options) // 將選項透傳給基類別 DbContext
{
}
public DbSet Users { get; set; }
}
這裡的 base(options) 確保資料庫連線字串、實體模型配置等核心選項正確傳遞至框架底層,是依賴注入容器正常運作的前提。
注意: base 關鍵字不能在靜態方法、靜態建構子、靜態屬性存取子中使用。因為靜態成員屬於類別本身,不屬於任何實例,自然也就沒有「基類別實例」可供參考。嘗試在靜態語境使用 base 會導致編譯錯誤 CS0120。
| 場景 | 語法 | 核心目的 |
|---|---|---|
| 方法覆寫協作 | base.Method() | 保留基類邏輯、擴充新行為 |
| 建構子初始化 | base(...) | 傳遞參數、確保基類狀態正確建立 |
| 框架擴充點 | base(options) | 將配置透傳給框架基礎設施 |
深入理解 base,能幫你在繼承體系中寫出更健壯、更符合框架慣例的程式碼,也是閱讀 .NET 基礎類別庫原始碼的必備鑰匙。