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) 僅能在建構子中賦值。
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();
base(...) 引數。object)。: this(...) 委派鏈)。| 錯誤 | 原因 | 修正 |
|---|---|---|
| CS1729: 找不到對應建構子 | 引數不匹配任何基類別建構子 | 檢查基類別建構子簽章,補齊引數 |
| CS0161: 非所有路徑回傳值 | 建構子中拋出例外未處理 | 建構子不回傳值,移除 return 或改用工廠方法 |
| CS0236: 欄位初始化運算式參考 this | 在欄位初始化運算式使用 this/基底成員 | 移至建構子本體初始化 |
| 虛擬方法在建構子中呼叫 | 衍生類別覆寫方法存取未初始化欄位 | 避免建構子呼叫 virtual 方法,或使用工廠模式 |
class Point(int X, int Y) { ... } 直接在類別宣告參數。