Compartilhar via


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. Isso permite que você permita que as classes derivam de sua classe e as impeça de substituir métodos ou propriedades virtuais específicos.

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. Ao substituir um membro virtual declarado em um tipo base, você pode impedir que tipos de derivação os substituam usando a palavra-chave selada como no exemplo a seguir:

public sealed override string ToString() => Value;

É um erro usar o modificador abstrato com uma classe selada, pois uma classe abstrata deve ser herdada por uma classe que forneça 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 os structs são implicitamente lacrados, 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 seguinte instrução:

class MyDerivedC: SealedClass {} // Error

O resultado é uma mensagem de erro:

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

Observações

Para determinar se uma classe, um método ou uma propriedade devem ser lacrados, você geralmente 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 que as classes derivadas possam modificar as suas classes de tal forma que elas não funcionem mais corretamente ou conforme o esperado.

Especificação da linguagem C#

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

Consulte também