一、抽象類別
- 特殊類別,**不可實例化**;除此具備一般類別特性 (欄位、方法、屬性、建構函式等)。
- 可包含抽象方法 (無實作,衍生類必須覆寫),也可包含虛擬/實體方法。
- 可繼承另一個抽象類別,可選擇覆寫或不覆寫基類抽象方法 (不覆寫則由更下層衍生類實作)。
- 支援單一繼承。
二、介面
- 參考型別,類似類別但不可實例化。
- 所有成員隱含 public,不可包含私有/受保護成員。
- 可包含方法、屬性、索引子、事件,**不可包含** 常數、欄位、建構函式、解構函式、靜態成員 (C# 8.0 前)。
- 類別可實作多個介面,但只能繼承一個類別 (含抽象類)。
- 支援回呼模式 (介面作為契約)。
三、核心差異比較
| 特性 | 抽象類別 | 介面 |
| 本質 | 對「物件」的抽象 (is-a) | 對「行為/契約」的規範 (can-do) |
| 繼承/實作 | 單一繼承 | 多重實作 |
| 預設實作 | 可提供 (虛擬/實體方法) | C# 8.0 前不可,8.0+ 可提供 default 實作 |
| 成員存取層級 | 可控制 (public/protected/private) | 隱含 public |
| 欄位/建構函式 | 可有 | 不可有 (C# 8.0 前) |
| 密封 | 不可密封 | 不適用 |
| 方法虛擬性 | 實體方法預設 virtual | 實作方法預設 non-virtual (可標記 virtual) |
四、選擇指南
- 預計多版本組件 → 抽象類別 (版本控制容易,新增非抽象成員不破壞現有衍生類)。
- 功能跨越廣泛異質物件 → 介面 (如
IDisposable, IComparable)。
- 小而單一功能區塊 → 介面 (單一職責,避免介面污染)。
- 大型功能單元、共享通用實作 → 抽象類別。
- 關係緊密的物件階層 → 抽象類別;鬆散關係共享功能 → 介面。
五、經典比喻
- 飛機/鳥 實作 IFly (介面);F22 繼承 FighterJet 抽象類,鴿子 繼承 Bird 抽象類。
- 門 (抽象類) 定義「是什麼」 (鐵門/木門);鎖 (介面) 定義「能做什麼」。一個門可有鎖、門鈴 (多介面)。介面污染 = 鎖被迫會發聲音。
六、進階:抽象類別實作介面
抽象類別可將介面方法對應至抽象方法,不提供實作,交由具體衍生類實現,達到契約傳遞效果。