首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 進階基礎:base 關鍵字完整指南——繼承鏈中的關鍵橋樑

     編輯:關於C語言

前言

在 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()(編譯器自動插入)。

三、Entity Framework 中的實戰應用:DbContext 傳遞鏈

EF Core 中 base 傳遞 DbContextOptions

在 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 基礎類別庫原始碼的必備鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved