一、抽象類核心規則速查
| 規則 | 說明 |
| 聲明抽象方法 | 使用 abstract 關鍵字,無方法體 |
| 可包含非抽象方法 | 抽象類可同時擁有具體實現方法 |
| 不可直接實例化 | new AbstractClass() 編譯報錯 |
| 繼承語法 | 用冒號 :,如 class Sub : Base |
| 實現抽象方法 | 子類用 override 關鍵字 |
| 可被抽象類繼承 | 結果仍為抽象類,除非所有抽象方法均被實現 |
| 修飾符不可變 | 實現後不能更改訪問修飾符(如 protected→public 非法) |
二、標準示例代碼
public abstract class Person {
// 抽象方法:強制子類實現
public abstract void SayHello();
// 具體方法:提供默認行為
public void About() {
Console.WriteLine("Abstract Demo");
}
}
public class Student : Person {
// 必須 override 實現抽象方法
public override void SayHello() {
Console.WriteLine("SayHello from Student");
}
}
class Program {
static void Main() {
// 編譯錯誤:Person p = new Person();
Person p = new Student(); // 多態引用
p.SayHello(); // 輸出: SayHello from Student
p.About(); // 輸出: Abstract Demo
}
}
三、抽象類 vs 介面:選擇指南
| 特性 | 抽象類 | 介面 |
| 多重實現 | 單繼承 | 多實現 |
| 字段/屬性 | 可有實例字段 | 僅靜態常量(C# 8.0 前) |
| 構造函數 | 可有,供子類調用 | 無 |
| 訪問修飾符 | 任意 | 默認 public |
| 版本演進 | 新增非抽象方法不破壞現有代碼 | 新增方法破壞所有實現類 |
| 適用場景 | 「是一種」關係,共享代碼/狀態 | 「能做什麼」契約,跨層次複用 |
四、進階應用:模板方法模式中的抽象類
抽象類是模板方法模式的核心載體:
public abstract class DataProcessor {
// 模板方法:定義算法骨架
public void Process() {
LoadData();
ValidateData();
TransformData();
SaveData();
}
// 鉤子方法:默認實現,子類可選擇覆蓋
protected virtual void ValidateData() { /* 默認驗證 */ }
// 抽象方法:強制子類實現
protected abstract void LoadData();
protected abstract void TransformData();
protected abstract void SaveData();
}
public class CsvProcessor : DataProcessor {
protected override void LoadData() { /* CSV 讀取 */ }
protected override void TransformData() { /* CSV 轉換 */ }
protected override void SaveData() { /* CSV 保存 */ }
}
五、常見誤區與最佳實踐
- 誤區:以為抽象類只能有抽象方法。事實:可混合具體/虛擬/抽象方法。
- 誤區:子類實現抽象方法時改為
public。規則:修飾符必須一致(通常為 protected 或 public)。
- 最佳實踐:抽象類命名以
Base 或 Abstract 結尾;介面以 I 開頭。
- 最佳實踐:優先用介面定義契約,需共享代碼/狀態時再引入抽象基類。
- C# 8.0+:介面可定義默認實現,邊界進一步模糊,但語義區別仍在。