| 場景 | 建議 | 理由 |
| 共用程式碼 (欄位、建構函式、預設實作) | 抽象類別 | 介面無法包含實例狀態 |
| 單一核心身分、強 is-a 關係 | 抽象類別 | 單一繼承語意清晰 |
| 跨層級、橫切關注點、多重組合 | 介面 | 多重實作、無狀態 |
| API 公開給第三方擴充 | 介面 | 不鎖死繼承鏈 |
實戰範例:交通工具體系
public abstract class Vehicle
{
public int Wheels { get; protected set; }
protected float Weight { get; set; }
protected Vehicle(int wheels, float weight)
{
Wheels = wheels;
Weight = weight;
}
// 抽象方法:每種交通工具鳴笛聲不同
public abstract void Honk();
// 虛方法:預設行為可選擇覆寫
public virtual void StartEngine() => Console.WriteLine("Engine starting...");
}
public class Car : Vehicle
{
public int Passengers { get; }
public Car(int passengers) : base(4, 1500f) => Passengers = passengers;
public override void Honk() => Console.WriteLine("Beep beep!");
public override void StartEngine() => Console.WriteLine("Car engine roaring!");
}
public class Truck : Vehicle
{
public float LoadCapacity { get; }
public Truck(float capacity) : base(6, 5000f) => LoadCapacity = capacity;
public override void Honk() => Console.WriteLine("Hooooonk!");
}
抽象屬性與索引器
public abstract class Entity
{
public abstract int Id { get; protected set; } // 抽象屬性
public abstract string this[string key] { get; set; } // 抽象索引器
}
衍生類別必須以 override 實作完整存取子 (get/set)。
建構函式在抽象類別中的角色
- 抽象類別可以有建構函式,供衍生類別透過
base(...) 呼叫
- 用於初始化共用欄位、驗證必要參數、強制子類別提供建構資訊
- 無法直接被外部呼叫 (因不可實例化)
常見設計模式應用
| 模式 | 抽象類別角色 |
| Template Method | 定義演算法骨架,抽象步驟交由子類別實作 |
| Factory Method | 抽象建立方法,具體工廠決定實例化型別 |
| Strategy (基類版) | 定義策略介面,預設實作為抽象/虛方法 |
總結
抽象類別是「不完整的具體類別」:它擁有狀態、建構函式、具體實作,同時宣告必須由子類別完成的抽象契約。善用它可在單一繼承限制下,最大程度共用程式碼並強制領域規則。
- 上一篇文章: C# 抽象方法詳解:語法規則、虛方法關係與重寫機制
- 下一篇文章: C# 多型核心機制:虛方法、覆寫與動態繫結完整指南
Copyright ©
程式碼之家 All Rights Reserved