sealed
定義:阻止類別被繼承或阻止虛擬方法被進一步覆寫。
特性:
- 應用於類別時,防止其他類別繼承該類別
- 應用於覆寫方法時,防止衍生類別進一步覆寫該方法
使用時機:
- 確保類別行為不被修改或擴展
- 防止安全相關邏輯被覆寫
- 優化性能(編譯器可以進行優化,因為知道不會有進一步的多型行為)
示例:
優點:增強安全性、明確設計意圖、提供潛在性能優化
缺點:降低代碼擴展性和靈活性
abstract
定義:宣告必須在衍生類別中實作的成員,或宣告不能直接實例化的類別。
特性:
- 抽象類別不能被直接實例化
- 抽象成員沒有實作,必須由衍生類別提供實作
- 含有抽象成員的類別必須被宣告為抽象類別
使用時機:
- 建立通用基礎類別,定義子類需實作的行為
- 定義框架結構,強制實作特定方法
- 當類別有部分功能已實作,但需要子類完成其他功能時
示例:
優點:提供清晰的通用結構,確保子類別實作必要行為
缺點:增加類別階層複雜度,可能造成繼承鏈過深
virtual
定義:宣告可被衍生類別覆寫的方法、屬性、索引器或事件。
特性:
- 基礎類別提供預設實作
- 衍生類別可以選擇覆寫(不強制)
- 實現多型行為的基礎
使用時機:
- 提供預設行為,但允許客製化
- 啟用多型功能
- 建立框架時,提供擴展點
示例:
優點:啟用多型,增加代碼靈活性,提供擴展點
缺點:需要仔細設計以避免過度使用,可能增加運行時複雜度
override
定義:提供衍生類的新實作。
特性:
- 必須覆寫標記為 virtual、abstract 或已被覆寫的成員
- 訪問修飾詞必須與被覆寫成員相同
- 返回類型必須與被覆寫成員相容
使用時機:
- 實作抽象成員
- 修改或擴展基礎類別的虛擬行為
- 參與多型鏈
示例:
優點:實現多型,客製化基礎類別行為
缺點:增加類間依賴,可能使繼承關係複雜
readonly
定義:宣告一個只能在宣告時或在構造函數中設定的成員變數。
特性:
- 宣告後,值只能在初始化或構造函數中設定
- 運行時(執行期)為常數,但可以在每個實例化時有不同值
- 可以應用於實例和靜態欄位
使用時機:
- 建立執行期常數
- 確保不可變性
- 保護配置和敏感資料不被修改
示例:
優點:增強不可變性,確保程式碼安全性,明確意圖
缺點:限制靈活性,初始化後不能修改
存取修飾詞與特殊修飾詞的組合使用
特殊修飾詞可以與存取修飾詞組合使用,實現更精細的控制:
特殊修飾詞的實用技巧
1. 類別設計層次
- 抽象類別 設計原則:
- 定義介面,強調契約和規範
- 可以實作共用功能
- 規劃為被繼承,不能被實例化
- 密封類別 設計原則:
- 防止被修改的完整實作
- 標記為最終行為
- 不規劃進一步擴展
2. virtual
vs abstract
選擇指南
- 當基礎行為有合理預設實作時,使用
virtual
- 當衍生類別必須提供實作且沒有合理預設時,使用
abstract
- 混合使用時,抽象類別可同時包含抽象和虛擬成員
3. readonly
與常量選擇
const
在編譯時求值,readonly
在執行期求值
- 需要為每個實例設置不同值時,使用
readonly
- 全局固定的值則使用
const