sealed(C# 参考)
应用于类时,sealed
修饰符会阻止其他类从该类继承。 在下面的示例中,类 B
继承自类 A
,但类无法从类 B
继承。
class A {}
sealed class B : A {}
还可以对替代基类中的虚方法或属性的方法或属性使用 sealed
修饰符。 这使你可以允许类派生自你的类并防止它们替代特定虚方法或属性。
例
在以下示例中,Z
继承自 Y
,但 Z
不能替代在 X
中声明并密封在 Y
中的虚拟函数 F
。
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
在类中定义新方法或属性时,可以通过不将它们声明为虚拟,来防止派生类替代它们。
重写基类型中声明的 virtual
成员时,可以使用密封关键字阻止派生类型重写它们,如以下示例所示:
public sealed override string ToString() => Value;
将 抽象 修饰符与密封类一起使用是错误的,因为抽象类必须由提供抽象方法或属性实现的类继承。
应用于方法或属性时,sealed
修饰符必须始终与 override 结合使用。
由于结构是隐式密封的,因此无法继承这些结构。
有关详细信息,请参阅继承。
有关更多示例,请参阅抽象类、密封类及类成员。
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
var sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine($"x = {sc.x}, y = {sc.y}");
}
}
// Output: x = 110, y = 150
在前面的示例中,可以使用以下语句尝试从密封类继承:
class MyDerivedC: SealedClass {} // Error
结果是一条错误消息:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
言论
若要确定是否密封类、方法或属性,通常应考虑以下两点:
派生类通过可以自定义类而可能获得的潜在好处。
派生类可能采用使它们无法再正常工作或按预期工作的方式来修改类的可能性。
C# 语言规范
有关详细信息,请参阅 C# 语言规范。 语言规范是 C# 语法和用法的明确来源。