Compartir a través de


sealed (Referencia de C#)

Cuando se aplica a una clase, el modificador sealed impide que otras clases hereden de ella. En el ejemplo siguiente, la clase B hereda de la clase A, pero ninguna clase puede heredar de la clase B.

class A {}
sealed class B : A {}

También puede usar el modificador sealed en un método o propiedad que invalide un método virtual o una propiedad en una clase base. Esto le permite permitir que las clases deriven de la clase y evitar que invaliden propiedades o métodos virtuales específicos.

Ejemplo

En el ejemplo siguiente, Z hereda de Y, pero Z no puede invalidar la función virtual F declarada en X y sellada en Y.

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"); }
}

Al definir nuevos métodos o propiedades en una clase, puede evitar que las clases derivadas las sobrescriban al no declararlas como virtual. Al invalidar un miembro de virtual declarado en un tipo base, puede evitar que los tipos derivados se invaliden mediante la palabra clave sealed como en el ejemplo siguiente:

public sealed override string ToString() => Value;

Es un error usar el modificador abstracto con una clase sellada, ya que una clase abstracta debe ser heredada por una clase que proporciona una implementación de los métodos o propiedades abstractas.

Cuando se aplica a un método o propiedad, el modificador sealed siempre se debe usar con override.

Dado que las estructuras están selladas implícitamente, no se pueden heredar.

Para obtener más información, vea Herencia.

Para obtener más ejemplos, vea Clases y miembros de clase abstractos y sellados.

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

En el ejemplo anterior, podría intentar heredar de la clase sellada mediante la instrucción siguiente:

class MyDerivedC: SealedClass {} // Error

El resultado es un mensaje de error:

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Observaciones

Para determinar si se debe sellar una clase, un método o una propiedad, por lo general debe tener en cuenta los dos puntos siguientes:

  • Las posibles ventajas que podrían obtener las clases derivadas con la capacidad de personalizar la clase.

  • El potencial de que las clases derivadas modifiquen tus clases de tal manera que dejen de funcionar correctamente o según lo esperado.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Consulte también