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

C# 抽象類別、密封類別與類別成員完整解析

     編輯:關於C#

本文系統整理 C# 中 abstract(抽象)、sealed(密封)修飾詞在類別與成員上的用法、限制與最佳實踐,並對比虛擬方法與抽象方法的異同,幫助開發者正確設計繼承體系。

1. 抽象類別與抽象成員

定義語法

public abstract class A { /* 類別成員 */ }

特性

  • 無法直接實例化(`new A()` 編譯錯誤)。
  • 可包含抽象成員(無實作)與具體成員(有實作)。
  • 目的:提供多個衍生類別共享的基礎定義,強制衍生類別實作特定行為。

抽象方法

public abstract class A {
    public abstract void DoWork(int i); // 僅宣告,無大括號
}
  • 衍生類別必須覆寫(`override`)所有抽象方法。
  • 可將繼承自基類的 `virtual` 方法標記為 `abstract override`,強制後續衍生類別重新實作(切斷原始實作鏈)。

範例:強制重新實作虛擬方法

public class D { public virtual void DoWork(int i) { /* 原始 */ } }
public abstract class E : D { public abstract override void DoWork(int i); }
public class F : E { public override void DoWork(int i) { /* 新實作 */ } }

此時 `F` 無法呼叫 `D.DoWork`,達到「強制重寫」效果。

2. 密封類別與密封成員

密封類別

public sealed class D { /* 成員 */ }
  • 不可被繼承(不可作為基類)。
  • 因此也不能是 `abstract`。
  • 運行時可對密封類別成員呼叫進行優化(非虛擬呼叫),略微提升效能。

密封成員(方法/屬性/事件)

  • 只能用於 `override` 成員上:`public sealed override void DoWork() { }`
  • 作用:阻斷繼承鏈,後續衍生類別無法再覆寫該成員。

3. 虛擬方法 vs 抽象方法

特性虛擬方法 (virtual)抽象方法 (abstract)
實作本體有(可提供預設行為)無(僅宣告)
衍生類別是否必須覆寫選擇性強制性
所屬類別一般類別或抽象類別只能在抽象類別中宣告
呼叫基類實作`base.Method()` 可存取無基類實作可呼叫

核心差異

抽象方法可視為「沒有實作本體的虛擬方法」;虛擬方法提供預設實作,抽象方法強制衍生類別提供實作。

4. 設計指引

  • is-a 關係且需共享程式碼 → 考慮 abstract class。
  • 定義行為契約、多型替換 → 優先 interface(C# 8+ 可含預設實作)。
  • 不希望被繼承/覆寫 → 加上 sealed。
  • 基類提供預設行為但允許擴展 → virtual。
  • 基類定義契約但不提供實作 → abstract。

參考資源

MSDN 官方文件:抽象與密封類別以及類別成員

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved