首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 抽象類深度解析:語法、規則與實戰模式

     編輯:關於C#

一、抽象類核心規則速查

規則說明
聲明抽象方法使用 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 保存 */ }
}

五、常見誤區與最佳實踐

  1. 誤區:以為抽象類只能有抽象方法。事實:可混合具體/虛擬/抽象方法。
  2. 誤區:子類實現抽象方法時改為 public。規則:修飾符必須一致(通常為 protected 或 public)。
  3. 最佳實踐:抽象類命名以 Base 或 Abstract 結尾;介面以 I 開頭。
  4. 最佳實踐:優先用介面定義契約,需共享代碼/狀態時再引入抽象基類。
  5. C# 8.0+:介面可定義默認實現,邊界進一步模糊,但語義區別仍在。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved