Compartir a través de


sealed (Referencia de C#)

El modificador sealed, cuando se aplica a una clase, impide que otras clases se hereden de él. En el ejemplo siguiente, la clase B se hereda de la clase A, pero no es posible heredar ninguna clase de la clase B.

    class A {}    
    sealed class B : A {}

El modificador sealed también puede utilizarse en un método o propiedad que invalide un método o propiedad virtual en una clase base. De esta forma, puede permitir la derivación de clases de su clase e impedir que invaliden determinados métodos o propiedades virtuales.

Ejemplo

En el ejemplo siguiente, Z se hereda de Y, pero Z no puede invalidar la función virtual F que se declara en X y se sella 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("C.F"); }

        // Overriding F2 is allowed. 
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }

Al definir nuevos métodos o propiedades en una clase, puede impedir que las clases derivadas invaliden dichos métodos o propiedades no declarándolos como virtual.

Es un error utilizar el modificador abstract con una clase sealed, puesto que una clase abstract debe heredarla una clase que proporcione una implementación de los métodos o propiedades abstract.

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

Dado que los structs son tipos sealed implícitamente, no se pueden heredar.

Para obtener más información, vea Herencia (Guía de programación de C#).

Para obtener más ejemplos, vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#).

    sealed class SealedClass
    {
        public int x;
        public int y;
    }

    class SealedTest2
    {
        static void Main()
        {
            SealedClass sc = new SealedClass();
            sc.x = 110;
            sc.y = 150;
            Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
        }
    }
    // Output: x = 110, y = 150

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

class MyDerivedC: SealedClass {} // Error

El resultado es un mensaje de error:

'MyDerivedC' cannot inherit from sealed class 'SealedClass'.

Especificación del lenguaje C#

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

Comentarios

Normalmente, para determinar si debe sellar una clase, método o propiedad, debe considerar los siguientes aspectos:

  • Las posibles ventajas que supondría para las clases derivadas la capacidad de personalizar su clase.

  • La posibilidad de que las clases derivadas pudieran modificar sus clases de forma que dejasen de funcionar correctamente o del modo esperado.

Vea también

Referencia

Palabras clave de C#

Clases estáticas y sus miembros (Guía de programación de C#)

Clases y miembros de clase abstractos y sellados (Guía de programación de C#)

Modificadores de acceso (Guía de programación de C#)

Modificadores (Referencia de C#)

override (Referencia de C#)

virtual (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#