resumo (Referência C#)

O abstract modificador indica que a coisa que está sendo modificada tem uma implementação ausente ou incompleta. O modificador abstrato pode ser usado com classes, métodos, propriedades, indexadores e eventos. Use o abstract modificador em uma declaração de classe para indicar que uma classe se destina apenas a ser uma classe base de outras classes, não instanciada por conta própria. Os membros marcados como resumo devem ser implementados por classes não abstratas que derivam da classe abstrata.

Exemplo 1

Neste exemplo, a classe Square deve fornecer uma implementação de GetArea porque deriva de Shape:

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

class Square : Shape
{
    private 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()
    {
        var sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
    }
}
// Output: Area of the square = 144

As aulas abstratas têm as seguintes características:

  • Uma classe abstrata não pode ser instanciada.

  • Uma classe abstrata pode conter métodos abstratos e acessórios.

  • Não é possível modificar uma classe abstrata com o modificador selado porque os dois modificadores têm significados opostos. O sealed modificador impede que uma classe seja herdada e o abstract modificador requer que uma classe seja herdada.

  • Uma classe não-abstrata derivada de uma classe abstrata deve incluir implementações reais de todos os métodos abstratos herdados e acessadores.

Use o abstract modificador em um método ou declaração de propriedade para indicar que o método ou propriedade não contém implementação.

Os métodos abstratos têm as seguintes características:

  • Um método abstrato é implicitamente um método virtual.

  • As declarações de método abstrato só são permitidas em classes abstratas.

  • Como uma declaração de método abstrato não fornece nenhuma implementação real, não há 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. Por exemplo:

    public abstract void MyMethod();  
    

    A implementação é fornecida por uma substituição de método, que é um membro de uma classe não-abstrata.

  • É um erro usar os modificadores estáticos ou virtuais em uma declaração de método abstrato.

As propriedades abstratas se comportam como métodos abstratos, exceto pelas diferenças na sintaxe de declaração e invocação.

  • É um erro usar o abstract modificador em uma propriedade estática.

  • Uma propriedade herdada abstrata pode ser substituída em uma classe derivada incluindo uma declaração de propriedade que usa o modificador de substituição .

Para obter mais informações sobre classes abstratas, consulte Classes abstratas e seladas e Membros da classe.

Uma classe abstrata deve fornecer implementação para todos os membros da interface.

Uma classe abstrata que implementa uma interface pode mapear os métodos de interface em métodos abstratos. Por exemplo:

interface I
{
    void M();
}

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

Exemplo 2

Neste exemplo, a classe DerivedClass é derivada de uma classe BaseClassabstrata . A classe abstrata contém um método abstrato, AbstractMethode duas propriedades abstratas, X e Y.

// Abstract class
abstract class BaseClass
{
    protected int _x = 100;
    protected int _y = 150;

    // Abstract method
    public abstract void AbstractMethod();

    // Abstract properties
    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()
    {
        var o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine($"x = {o.X}, y = {o.Y}");
    }
}
// Output: x = 111, y = 161

No exemplo anterior, se você tentar instanciar a classe abstrata usando uma instrução como esta:

BaseClass bc = new BaseClass();   // Error  

Você receberá um erro dizendo que o compilador não pode criar uma instância da classe abstrata 'BaseClass'.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso do C#.

Consulte também