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

C# 建構子參數傳遞與基類別初始化:base 關鍵字、多載鏈與車輛繼承實例

     編輯:關於C#

建構子參數化:實現靈活初始化


public class Vehicle {
    public int Wheels { get; }
    public float Weight { get; }

    // 無參數建構子:委派給主要建構子
    public Vehicle() : this(4, 1500f) { }

    // 主要建構子:完整初始化
    public Vehicle(int wheels, float weight) {
        Wheels = wheels;
        Weight = weight;
    }
}
  • 使用 this(...) 串聯建構子,避免重複初始化邏輯。
  • 唯讀屬性 (get only) 僅能在建構子中賦值。

衍生類別呼叫基類別建構子:base 關鍵字


public class Car : Vehicle {
    public int Passengers { get; }

    // 必須顯式呼叫基類別建構子
    public Car(int wheels, float weight, int passengers)
        : base(wheels, weight) { // base 對應 Vehicle(int, float)
        Passengers = passengers;
    }

    // 便利建構子:委派給主要建構子
    public Car(int passengers) : this(4, 1500f, passengers) { }
}

若基類別有無參數建構子,衍生類別可省略 : base() (隱含呼叫);否則必須顯式指定。

完整車輛繼承體系範例


public abstract class Vehicle {
    public int Wheels { get; protected set; }
    public float Weight { get; protected set; }
    protected Vehicle(int wheels, float weight) { Wheels = wheels; Weight = weight; }
    public abstract void Show();
}

public class Train : Vehicle {
    public int Carriages { get; }
    public int Passengers { get; }

    public Train() : this(0, 0, 0) { }
    public Train(int carriages, int passengers, float weight)
        : base(carriages * 8, weight) { // 假設每節車廂 8 輪
        Carriages = carriages;
        Passengers = passengers;
    }
    public override void Show() => Console.WriteLine($"Train: {Carriages} cars, {Passengers} passengers, {Weight}kg");
}

public class Car : Vehicle {
    public int Passengers { get; }
    public Car(int wheels, float weight, int passengers) : base(wheels, weight) {
        Passengers = passengers;
    }
    public override void Show() => Console.WriteLine($"Car: {Wheels} wheels, {Passengers} passengers, {Weight}kg");
}

// 使用
var vehicles = new Vehicle[] {
    new Vehicle(4, 1500f), // 錯誤:Vehicle 為 abstract
    new Train(10, 500, 200000f),
    new Car(4, 1500f, 5)
};
foreach (var v in vehicles) v.Show();

建構子執行順序詳細時序

  1. 衍生類別建構子進入,評估 base(...) 引數。
  2. 基類別建構子執行 (遞迴至 object)。
  3. 基類別實例欄位初始化運算式 (依宣告順序)。
  4. 基類別建構子本體執行。
  5. 返回衍生類別,執行衍生類別實例欄位初始化運算式。
  6. 執行衍生類別建構子本體 (含 : this(...) 委派鏈)。

常見錯誤與解決方案

錯誤原因修正
CS1729: 找不到對應建構子引數不匹配任何基類別建構子檢查基類別建構子簽章,補齊引數
CS0161: 非所有路徑回傳值建構子中拋出例外未處理建構子不回傳值,移除 return 或改用工廠方法
CS0236: 欄位初始化運算式參考 this在欄位初始化運算式使用 this/基底成員移至建構子本體初始化
虛擬方法在建構子中呼叫衍生類別覆寫方法存取未初始化欄位避免建構子呼叫 virtual 方法,或使用工廠模式

現代 C# 建構子簡化語法

  • 主要建構子 (C# 12 / .NET 8) - class Point(int X, int Y) { ... } 直接在類別宣告參數。
  • record 類別 自動產生建構子、解構子、相等比較。
  • required 屬性 (C# 11) 強制物件初始化器提供值,減少建構子多載。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved