? ? ? ? 密封(sealed)是C#中用于限制繼承和多態行為的關鍵字,它可以應用于類和方法,提供了一種控制繼承層次的方式。
密封類
特點
- 使用
sealed
關鍵字修飾的類 - 密封類不能被其他類繼承,但可以繼承其他類或接口
- 主要用于防止派生
- 所有結構(struct)都是隱式密封的
使用場景
- 當類包含敏感信息或關鍵功能,不希望被修改時
- 當類是一個工具類或靜態類(雖然靜態類已經是隱式密封的)
- 出于性能考慮(運行時優化)
- 設計上不需要被繼承的類
示例代碼
public sealed class ConfigurationManager
{private static readonly ConfigurationManager instance = new ConfigurationManager();// 私有構造函數防止實例化private ConfigurationManager() { }public static ConfigurationManager Instance => instance;public string GetConfig(string key){// 實現配置獲取邏輯return "ConfigValue";}
}// 嘗試繼承會編譯錯誤
// public class CustomConfigManager : ConfigurationManager { } // 錯誤: 無法從密封類型繼承
密封方法
特點
- 只能用于重寫基類虛方法的方法
- 使用
sealed override
組合,sealed必須和override關鍵字在方法聲明中一起使用 - 密封方法不能在繼承過程中被派生類重寫,防止派生類進一步重寫該方法
- 可以密封單個方法而不密封整個類
使用場景
- 當方法的實現已經很完善,不希望子類修改時
- 當方法涉及關鍵業務邏輯,必須保持穩定時
示例代碼
public class Animal
{public virtual void MakeSound(){Console.WriteLine("Animal makes a sound");}
}public class Dog : Animal
{// 密封此方法,防止進一步重寫public sealed override void MakeSound(){Console.WriteLine("Bark bark!");}
}public class GoldenRetriever : Dog
{// 嘗試重寫會編譯錯誤// public override void MakeSound() { } // 錯誤: 無法重寫繼承成員,因為它是密封的// 可以隱藏基類方法(但不推薦)public new void MakeSound(){Console.WriteLine("Quiet bark...");}
}// 使用
Animal dog = new GoldenRetriever();
dog.MakeSound(); // 輸出: Bark bark! (因為隱藏方法不會影響多態行為)
密封類與密封方法的比較
特性 | 密封類 | 密封方法 |
關鍵字 |
|
|
作用對象 | 整個類 | 單個方法 |
主要目的 | 防止類被繼承 | 防止方法被進一步重寫 |
使用場景 | 工具類、單例、安全關鍵類 | 關鍵方法、穩定實現的方法 |
繼承影響 | 完全阻止繼承 | 只阻止特定方法的重寫 |
實際應用建議
- 謹慎使用密封:除非有明確理由,否則不要輕易密封類或方法,這會限制代碼的擴展性
- 框架設計:在開發供他人使用的庫或框架時,密封可以作為一種設計約束
- 性能考慮:密封類和密封方法有時可以幫助JIT編譯器進行優化
- 安全考慮:防止關鍵類被惡意派生或關鍵方法被篡改
.NET框架中許多類都是密封的,如String
、Math
等,這是因為它們的功能已經非常完善且穩定,不需要擴展。