abstract (Referência de C#)abstract (C# Reference)

O modificador abstract indica que o item que está sendo modificado tem uma implementação ausente ou incompleta.The abstract modifier indicates that the thing being modified has a missing or incomplete implementation. O modificador abstrato pode ser usado com classes, métodos, propriedades, indexadores e eventos.The abstract modifier can be used with classes, methods, properties, indexers, and events. Use o modificador abstract em uma declaração de classe para indicar que uma classe se destina somente a ser uma classe base de outras classes, não instanciada por conta própria.Use the abstract modifier in a class declaration to indicate that a class is intended only to be a base class of other classes, not instantiated on its own. Membros marcados como abstratos precisam ser implementados por classes que derivam da classe abstrata.Members marked as abstract must be implemented by classes that derive from the abstract class.

ExemploExample

Neste exemplo, a classe Square deve fornecer uma implementação de GetArea porque deriva de Shape:In this example, the class Square must provide an implementation of GetArea because it derives from Shape:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    int side;

    public Square(int n) => side = n;

    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => side * side;

    static void Main() 
    {
        Square sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
    }

    interface I
    {
        void M();
    }
    abstract class C : I
    {
        public abstract void M();
    }

}
// Output: Area of the square = 144

As classes abstratas têm os seguintes recursos:Abstract classes have the following features:

  • Uma classe abstrata não pode ser instanciada.An abstract class cannot be instantiated.

  • Uma classe abstrata pode conter acessadores e métodos abstratos.An abstract class may contain abstract methods and accessors.

  • Não é possível modificar uma classe abstrata com o modificador sealed porque os dois modificadores têm significados opostos.It is not possible to modify an abstract class with the sealed modifier because the two modifiers have opposite meanings. O modificador sealed impede que uma classe seja herdada e o modificador abstract requer uma classe a ser herdada.The sealed modifier prevents a class from being inherited and the abstract modifier requires a class to be inherited.

  • Uma classe não abstrata derivada de uma classe abstrata deve incluir implementações reais de todos os acessadores e métodos abstratos herdados.A non-abstract class derived from an abstract class must include actual implementations of all inherited abstract methods and accessors.

Use o modificador abstract em uma declaração de método ou propriedade para indicar que o método ou propriedade não contem a implementação.Use the abstract modifier in a method or property declaration to indicate that the method or property does not contain implementation.

Os métodos abstratos têm os seguintes recursos:Abstract methods have the following features:

  • Um método abstrato é implicitamente um método virtual.An abstract method is implicitly a virtual method.

  • Declarações de método abstrato são permitidas apenas em classes abstratas.Abstract method declarations are only permitted in abstract classes.

  • Como uma declaração de método abstrato não fornece nenhuma implementação real, não há nenhum corpo de método, a declaração do método simplesmente termina com um ponto e vírgula e não há chaves ({ }) após a assinatura.Because an abstract method declaration provides no actual implementation, there is no method body; the method declaration simply ends with a semicolon and there are no curly braces ({ }) following the signature. Por exemplo:For example:

    public abstract void MyMethod();  
    

    A implementação é fornecida por uma substituição de método, que é um membro de uma classe não abstrata.The implementation is provided by a method override, which is a member of a non-abstract class.

  • É um erro usar os modificadores static ou virtual em uma declaração de método abstrato.It is an error to use the static or virtual modifiers in an abstract method declaration.

Propriedades abstratas se comportam como métodos abstratos, exceto pelas diferenças na sintaxe de declaração e chamada.Abstract properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • É um erro usar o modificador abstract em uma propriedade estática.It is an error to use the abstract modifier on a static property.

  • Uma propriedade herdada abstrata pode ser substituída em uma classe derivada incluindo uma declaração de propriedade que usa o modificador override.An abstract inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

Para obter mais informações sobre classes abstratas, consulte Classes e membros de classes abstratos e lacrados.For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Uma classe abstrata deve fornecer uma implementação para todos os membros de interface.An abstract class must provide implementation for all interface members.

Uma classe abstrata que implementa uma interface pode mapear os métodos de interface em métodos abstratos.An abstract class that implements an interface might map the interface methods onto abstract methods. Por exemplo:For example:

interface I
{
    void M();
}
abstract class C : I
{
    public abstract void M();
}

ExemploExample

Nesse exemplo, a classe DerivedClass é derivada de uma classe abstrata BaseClass.In this example, the class DerivedClass is derived from an abstract class BaseClass. A classe abstrata contém um método abstrato, AbstractMethod e duas propriedades abstratas, X e Y.The abstract class contains an abstract method, AbstractMethod, and two abstract properties, X and Y.

abstract class BaseClass   // Abstract class
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // Abstract method
    public abstract int X    { get; }
    public abstract int Y    { get; }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        _x++;
        _y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return _x + 10;
        }
    }

    public override int Y   // overriding property
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
    }
}
// Output: x = 111, y = 161

No exemplo anterior, se você tentar instanciar a classe abstrata usando uma instrução como esta:In the preceding example, if you attempt to instantiate the abstract class by using a statement like this:

BaseClass bc = new BaseClass();   // Error  

Você receberá uma mensagem de erro informando que o compilador não pode criar uma instância da classe abstrata "BaseClass".You will get an error saying that the compiler cannot create an instance of the abstract class 'BaseClass'.

Especificação da Linguagem C#C# Language Specification

Para obter mais informações, consulte a Especificação da linguagem C#.For more information, see the C# Language Specification. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.The language specification is the definitive source for C# syntax and usage.

Consulte tambémSee also