sealed (Referência de C#)

Quando aplicado a uma classe, o modificador sealed impede que outras classes herdem dela. No exemplo a seguir, a classe B herda da classe A, mas nenhuma classe pode herdar da classe B.

class A {}
sealed class B : A {}

Você também pode usar o modificador sealed em um método ou propriedade que substitui um método ou propriedade virtual em uma classe base. Com isso, você pode permitir que classes sejam derivadas de sua classe e impedir que substituam métodos ou propriedades virtuais.

Exemplo

No exemplo a seguir, Z herda de Y, mas Z não pode substituir a função virtual F declarada em X e lacrada em 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"); }
}

Quando define novos métodos ou propriedades em uma classe, você pode impedir que classes derivadas as substituam ao não declará-las como virtuais.

É um erro usar o modificador abstract com uma classe selada, porque uma classe abstrata deve ser herdada por uma classe que fornece uma implementação dos métodos ou propriedades abstratas.

Quando aplicado a um método ou propriedade, o modificador sealed sempre deve ser usado com override.

Como structs são lacrados implicitamente, eles não podem ser herdados.

Para obter mais informações, consulte Herança.

Para obter mais exemplos, consulte Classes e membros de classes abstratas e lacradas.

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

No exemplo anterior, você pode tentar herdar da classe lacrada usando a instrução a seguir:

class MyDerivedC: SealedClass {} // Error

O resultado é uma mensagem de erro:

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

Comentários

Para determinar se deve lacrar uma classe, método ou propriedade, geralmente você deve considerar os dois pontos a seguir:

  • Os possíveis benefícios que as classes derivadas podem obter por meio da capacidade de personalizar a sua classe.

  • O potencial de as classes derivadas modificarem suas classes de forma que elas deixem de funcionar corretamente ou como esperado.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Confira também