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

A palavra-chave abstract permite criar classes e membros de classe que estão incompletos e devem ser implementados em uma classe derivada.

A palavra-chave lacrada permite que você impeça a herança de uma classe ou de certos membros de classe que foram marcados anteriormente como virtuais.

Classes abstratas e membros da classe

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

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

Uma classe abstrata não pode ser instanciada. O objetivo 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 parâmetro para muitas de suas funções e exigir que os programadores que usam essa biblioteca forneçam 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, então a definição do método é seguida por um ponto-e-vírgula em vez de um bloco de método normal. As 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 virtual método for declarado abstract, ele ainda será virtual para qualquer classe herdada 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 a classe D. Desta 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 da classe

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

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

Uma classe selada não pode ser usada como classe base. Por esta razão, não pode ser também uma classe abstrata. As classes seladas impedem a derivação. Como eles nunca podem ser usados como uma classe base, algumas otimizações de tempo de execução podem tornar a chamada de membros de classe lacrada 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 aspeto virtual do membro para qualquer outra classe derivada. 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