Classes e membros de classes abstract e sealed (Guia de Programação em C#)

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

A palavra-chave sealed permite evitar a herança de uma classe ou de determinados membros de classe que foram marcados anteriormente com virtual.

Classes abstratas e membros de 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. A finalidade de uma classe abstrata é fornecer uma definição comum de uma classe base que pode ser compartilhada por várias classes derivadas. Por exemplo, uma biblioteca de classes pode definir uma classe abstrata que serve como um parâmetro para muitas de suas funções e exige que os programadores que usam essa biblioteca forneçam sua própria implementação da classe, criando uma classe derivada.

As classes abstratas também podem definir métodos abstratos. Isso é realizado através da adição da palavra-chave abstract antes do tipo de retorno do método. Por exemplo:

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

Os 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. 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 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 fornecerem novas implementações de método para métodos virtuais.

Classes e membros de classes sealed

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

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

Uma classe sealed não pode ser usada como uma classe base. Por esse motivo, também não pode ser uma classe abstrata. As classes sealed impedem a derivação. Como elas nunca podem ser usadas como uma classe base, algumas otimizações em tempo de execução podem tornar a chamada a membros de classe sealed ligeiramente mais rápida.

Um método, um indexador, uma propriedade ou um evento em uma classe derivada que está substituindo um membro virtual da classe base, pode declarar esse membro como sealed. Isso anula o aspecto virtual do membro para qualquer outra classe derivada. Isso é realizado através da colocação da palavra-chave sealed antes da palavra-chave override na declaração de membro de classe. Por exemplo:

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

Confira também