在 C# 中,sealed 修饰符的作用是 “密封” —— 用来阻止类被继承,或者阻止方法/属性在派生类中被重写


✅ 1. sealed 用于 类(class)

作用:
  • 禁止其他类继承这个类
  • 如果尝试继承一个 sealed 类,编译器会报错。
示例:
public sealed class FinalClass
{
    public void DoWork() { }
}

// ❌ 编译错误!不能继承 sealed 类
public class DerivedClass : FinalClass 
{
}

💡 常见用途:

  • 设计上不希望被扩展的类(如工具类、值对象)
  • 提高性能(JIT 编译器对 sealed 类有优化)
  • .NET 中很多内置类型是 sealed 的,比如 stringDateTime

✅ 2. sealed 用于 方法或属性(必须与 override 一起用)

作用:
  • 允许当前类继承并重写父类的虚成员(virtualabstract),
    但禁止它的子类再进一步重写这个成员
示例:
public class Base
{
    public virtual void Say() => Console.WriteLine("Base");
}

public class Middle : Base
{
    // 重写 Say,并密封它
    public sealed override void Say() => Console.WriteLine("Middle (sealed)");
}

public class Child : Middle
{
    // ❌ 编译错误!Say() 已被 sealed,不能再重写
    // public override void Say() { }
}

🔔 注意:

  • sealed 修饰方法时,必须同时使用 override
  • 不能直接对非虚方法加 sealed

📌 为什么使用 sealed

场景 原因
防止滥用继承 有些类设计为“最终版本”,不希望被随意扩展
安全性 避免子类破坏原有逻辑(尤其在库开发中)
性能优化 JIT 编译器可以对 sealed 类做内联等优化
明确设计意图 表达“这个类到此为止”的语义

⚠️ 常见误区

错误:以为 sealed 类不能有虚方法
正解sealed可以有虚方法,但它自己不能被继承,所以这些虚方法实际上也无法被重写(因为没子类)。

错误sealed 方法可以单独使用
正解sealed 方法必须搭配 override,不能单独修饰一个普通方法。


✅ 小结

用法 含义
sealed class MyClass 该类不能被继承
sealed override void MyMethod() 该方法在当前类是最终版本,子类不能再重写

💡 记住口诀:“sealed = 到此为止,不准再改”


如果你正在设计一个工具类(比如 MathHelper),并且确定不需要继承,就可以把它声明为 sealed

public sealed class MathHelper
{
    public static int Add(int a, int b) => a + b;
    // 没有实例成员,也不需要继承 → 用 sealed 很合适
}

问题

如何防止类被继承?或者让类继承但是防止其某些方法被重写?

使用sealed修饰符

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐