Compartilhar via


Classes abstratas e lacradas e membros de classe (Guia de Programação em C#)

A palavra-chave abstrata permite que você crie classes e membros de classe incompletos e que devem ser implementados em uma classe derivada.

A palavra-chave selada permite evitar a herança de uma classe ou de membros específicos da classe que foram marcados anteriormente como virtuais.

Classes abstratas e membros de classe

As classes podem ser declaradas como abstratas colocando a palavra-chave abstract antes da definição da classe. Por exemplo:

public abstract class A
{
    // Class members here.
}

Uma classe abstrata não pode ser instanciada. A finalidade de uma classe abstrata é fornecer uma definição comum de uma classe base que várias classes derivadas podem compartilhar. Por exemplo, uma biblioteca de classes pode definir uma classe abstrata que é usada como um parâmetro para muitas de suas funções e exigir que os programadores usem essa biblioteca para fornecer sua própria implementação da classe criando uma classe derivada.

Classes abstratas também podem definir métodos abstratos. Isso é feito adicionando a palavra-chave abstract antes do tipo de retorno do método. Por exemplo:

public abstract class A
{
    public abstract void DoWork(int i);
}

Métodos abstratos não têm implementação, portanto, a definição do método é seguida por um ponto-e-vírgula em vez de um bloco de método normal. Classes derivadas da classe abstrata devem implementar todos os métodos abstratos. Quando uma classe abstrata herda um método virtual de uma classe base, a classe abstrata pode substituir o método virtual por um método abstrato. Por exemplo:

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Se um método virtual for declarado abstract, ele ainda será virtual para qualquer classe que herdar da classe abstrata. Uma classe que herda um método abstrato não pode acessar a implementação original do método, no exemplo anterior, DoWork na classe F não pode chamar DoWork na classe D. Dessa forma, uma classe abstrata pode forçar classes derivadas a fornecer novas implementações de método para métodos virtuais.

Classes seladas e membros de classe

As classes podem ser declaradas como seladas colocando a palavra-chave sealed antes da definição da classe. Por exemplo:

public sealed class D
{
    // Class members here.
}

Uma classe lacrada não pode ser usada como uma classe base. Por esse motivo, também não pode ser uma classe abstrata. Classes seladas impedem a derivação. Como eles nunca podem ser usados como uma classe base, algumas otimizações em tempo de execução podem tornar a chamada de membros de classe selada um pouco mais rápida.

Um método, indexador, propriedade ou evento, em uma classe derivada que está substituindo um membro virtual da classe base pode declarar esse membro como lacrado. Isso nega o aspecto virtual do membro para qualquer classe derivada adicional. Isso é feito colocando a sealed palavra-chave antes da palavra-chave override na declaração de membro da classe. Por exemplo:

public class D : C
{
    public sealed override void DoWork() { }
}

Consulte também