C# 密封类和密封方法

密封(sealed)是C#中用于限制继承和多态行为的关键字,它可以应用于类和方法,提供了一种控制继承层次的方式。

密封类

特点

  • 使用 sealed 关键字修饰的类
  • 密封类不能被其他类继承,但可以继承其他类或接口
  • 主要用于防止派生
  • 所有结构(struct)都是隐式密封的

使用场景

  1. 当类包含敏感信息或关键功能,不希望被修改时
  2. 当类是一个工具类或静态类(虽然静态类已经是隐式密封的)
  3. 出于性能考虑(运行时优化)
  4. 设计上不需要被继承的类

示例代码

cs 复制代码
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关键字在方法声明中一起使用
  • 密封方法不能在继承过程中被派生类重写,防止派生类进一步重写该方法
  • 可以密封单个方法而不密封整个类

使用场景

  1. 当方法的实现已经很完善,不希望子类修改时
  2. 当方法涉及关键业务逻辑,必须保持稳定时

示例代码

cs 复制代码
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! (因为隐藏方法不会影响多态行为)

密封类与密封方法的比较

|------|----------------|-------------------|
| 特性 | 密封类 | 密封方法 |
| 关键字 | sealed class | sealed override |
| 作用对象 | 整个类 | 单个方法 |
| 主要目的 | 防止类被继承 | 防止方法被进一步重写 |
| 使用场景 | 工具类、单例、安全关键类 | 关键方法、稳定实现的方法 |
| 继承影响 | 完全阻止继承 | 只阻止特定方法的重写 |

实际应用建议

  1. 谨慎使用密封:除非有明确理由,否则不要轻易密封类或方法,这会限制代码的扩展性
  2. 框架设计:在开发供他人使用的库或框架时,密封可以作为一种设计约束
  3. 性能考虑:密封类和密封方法有时可以帮助JIT编译器进行优化
  4. 安全考虑:防止关键类被恶意派生或关键方法被篡改

.NET框架中许多类都是密封的,如String、Math等,这是因为它们的功能已经非常完善且稳定,不需要扩展。

相关推荐
椒颜皮皮虾྅1 小时前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda
椒颜皮皮虾྅3 小时前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#
罗迪尼亚的熔岩3 小时前
联合kuka机器人, 海康visonmaster 的手眼9点标定方法
机器人·c#·工业相机·标定
她说彩礼65万4 小时前
C# TaskCompletionSource
java·开发语言·c#
泛凡(Linyongui)20 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯21 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员1 天前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y1 天前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水1 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅1 天前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda