Classes e membros de classes abstract e sealed (Guia de Programação em C#)Abstract and Sealed Classes and Class Members (C# Programming Guide)

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.The abstract keyword enables you to create classes and class members that are incomplete and must be implemented in a derived class.

A palavra-chave sealed permite evitar a herança de uma classe ou de determinados membros de classe que foram marcados anteriormente com virtual.The sealed keyword enables you to prevent the inheritance of a class or certain class members that were previously marked virtual.

Classes abstratas e membros de classeAbstract Classes and Class Members

As classes podem ser declaradas como abstratas, colocando a palavra-chave abstract antes da definição de classe.Classes can be declared as abstract by putting the keyword abstract before the class definition. Por exemplo:For example:

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

Uma classe abstrata não pode ser instanciada.An abstract class cannot be instantiated. A finalidade de uma classe abstrata é fornecer uma definição comum de uma classe base que pode ser compartilhada por várias classes derivadas.The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share. 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.For example, a class library may define an abstract class that is used as a parameter to many of its functions, and require programmers using that library to provide their own implementation of the class by creating a derived class.

As classes abstratas também podem definir métodos abstratos.Abstract classes may also define abstract methods. Isso é realizado através da adição da palavra-chave abstract antes do tipo de retorno do método.This is accomplished by adding the keyword abstract before the return type of the method. Por exemplo:For example:

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.Abstract methods have no implementation, so the method definition is followed by a semicolon instead of a normal method block. As classes derivadas da classe abstrata devem implementar todos os métodos abstratos.Derived classes of the abstract class must implement all abstract methods. 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.When an abstract class inherits a virtual method from a base class, the abstract class can override the virtual method with an abstract method. Por exemplo:For example:

// 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.If a virtual method is declared abstract, it is still virtual to any class inheriting from the abstract class. 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.A class inheriting an abstract method cannot access the original implementation of the method—in the previous example, DoWork on class F cannot call DoWork on class D. In this way, an abstract class can force derived classes to provide new method implementations for virtual methods.

Classes e membros de classes sealedSealed Classes and Class Members

As classes podem ser declaradas como sealed, colocando a palavra-chave sealed antes da definição de classe.Classes can be declared as sealed by putting the keyword sealed before the class definition. Por exemplo:For example:

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

Uma classe sealed não pode ser usada como uma classe base.A sealed class cannot be used as a base class. Por esse motivo, também não pode ser uma classe abstrata.For this reason, it cannot also be an abstract class. As classes sealed impedem a derivação.Sealed classes prevent derivation. 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.Because they can never be used as a base class, some run-time optimizations can make calling sealed class members slightly faster.

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.A method, indexer, property, or event, on a derived class that is overriding a virtual member of the base class can declare that member as sealed. Isso anula o aspecto virtual do membro para qualquer outra classe derivada.This negates the virtual aspect of the member for any further derived class. Isso é realizado através da colocação da palavra-chave sealed antes da palavra-chave override na declaração de membro de classe.This is accomplished by putting the sealed keyword before the override keyword in the class member declaration. Por exemplo:For example:

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

Confira tambémSee also