本文系統整理 C# 中 abstract(抽象)、sealed(密封)修飾詞在類別與成員上的用法、限制與最佳實踐,並對比虛擬方法與抽象方法的異同,幫助開發者正確設計繼承體系。
public abstract class A { /* 類別成員 */ }
public abstract class A {
public abstract void DoWork(int i); // 僅宣告,無大括號
}
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`,達到「強制重寫」效果。
public sealed class D { /* 成員 */ }
| 特性 | 虛擬方法 (virtual) | 抽象方法 (abstract) |
|---|---|---|
| 實作本體 | 有(可提供預設行為) | 無(僅宣告) |
| 衍生類別是否必須覆寫 | 選擇性 | 強制性 |
| 所屬類別 | 一般類別或抽象類別 | 只能在抽象類別中宣告 |
| 呼叫基類實作 | `base.Method()` 可存取 | 無基類實作可呼叫 |
抽象方法可視為「沒有實作本體的虛擬方法」;虛擬方法提供預設實作,抽象方法強制衍生類別提供實作。
abstract class。interface(C# 8+ 可含預設實作)。sealed。virtual。abstract。MSDN 官方文件:抽象與密封類別以及類別成員