本文系統整理 C# 核心型別系統與多型機制的關鍵概念差異,適合面試複習、架構設計參考與教學大綱。
| 維度 | 類別 | 介面 |
|---|---|---|
| 目的 | 實作與狀態封裝 | 定義契約/行為規範 |
| 成員類型 | 欄位、屬性、方法、事件、建構函式、運算子、索引子 | 方法、屬性、事件、索引子 (C# 8+ 可有預設實作) |
| 繼承 | 單一繼承 (單一基類) | 多重實作 (可實作多個介面) |
| 實例化 | 可 `new` (非 abstract) | 不可直接實例化 |
| 存取修飾詞 | 完整支援 | 預設 `public`,C# 8+ 支援 `private`/`protected` 靜態成員 |
| 特性 | virtual | abstract |
|---|---|---|
| 實作本體 | 有 (可提供預設行為) | 無 (僅宣告) |
| 所屬類別 | 一般/抽象類別 | 只能在 abstract 類別 |
| 衍生類別義務 | 可選擇 override | 必須 override (除非衍生類別也為 abstract) |
| 呼叫基類 | `base.Method()` 可存取 | 無基類實作 |
| 修飾詞組合 | `virtual`、`override`、`sealed override` | `abstract`、`override`、`sealed override` |
抽象方法 = 沒有實作本體的虛擬方法,強制衍生類別提供實作;虛擬方法提供預設實作,允許選擇性覆寫。
public class Base { public virtual void Work() { } }
public abstract class Middle : Base { public abstract override void Work(); } // 強制後續衍生類別重寫
public class Leaf : Middle { public override void Work() { } } // 必須實作
| 特性 | 值類型 (struct/enum/primitive) | 參考類型 (class/interface/delegate/array) |
|---|---|---|
| 記憶體配置 | 堆疊 (內嵌於父物件/區域變數) | 堆積 (物件)、堆疊存參考 |
| 指派語意 | 複製實際數值 | 複製參考 (指向同一物件) |
| 預設值 | 全零位元模式 (0, false, null 等) | `null` |
| 可為 null | 需包裝 `Nullable | 天生可為 null |
| 繼承 | 隱性繼承 ValueType,不可繼承其他類別,不可被繼承 (sealed) | 單一繼承 object,可繼承介面 |
| 效能 | 無 GC 壓力、存取快、適合小型資料結構 | GC 管理、間接存取、適合複雜物件 |
struct:值類型、堆疊、無建構函式限制 (需初始化所有欄位)、適合 < 16 bytes、不可變模式首選。class:參考類型、堆積、支援完整繼承/多型、適合商務實體、服務、控制器。
需要定義契約嗎?
├─ 是 → 介面 (interface)
│ ├─ 需共享程式碼/狀態? → 抽象類別 (abstract class) 實作介面
│ └─ 否 → 直接實作介面
└─ 否 → 需要實例化嗎?
├─ 否 → 抽象類別
└─ 是 → 一般類別
├─ 需要多型? → virtual/abstract 方法
├─ 需要不可變小型資料? → struct (readonly struct)
└─ 一般商務邏輯 → class
理解這三組核心差異,是掌握 C# 型別系統、正確應用多型、設計可維護架構的基石。實務中:介面定義契約、抽象類別共享實作、虛擬方法提供擴展點、抽象方法強制實作、值類型承載資料、參考類型建模行為。