abstract (Referencia de C#)

El modificador abstract indica que lo que se modifica carece de implementación o tiene una implementación incompleta. El modificador abstract puede usarse con clases, métodos, propiedades, indexadores y eventos. Use el modificador abstract en una declaración de clase para indicar que una clase está diseñada como clase base de otras clases, no para crear instancias por sí misma. Los miembros marcados como abstractos deben implementarse con clases no abstractas derivadas de la clase abstracta.

Ejemplo 1

En este ejemplo, la clase Square debe proporcionar una implementación de GetArea porque se 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

Las clases abstractas tienen las siguientes características:

  • No se pueden crear instancias de una clase abstracta.

  • Una clase abstracta puede contener descriptores de acceso y métodos abstractos.

  • No es posible modificar una clase abstracta con el modificador sealed porque los dos modificadores tienen significados opuestos. El modificador sealed impide que una clase se herede y el modificador abstract requiere que una clase se herede.

  • Una clase no abstracta que derive de una clase abstracta debe incluir implementaciones reales de todos los descriptores de acceso y métodos abstractos heredados.

Use el modificador abstract en una declaración de método o de propiedad para indicar que el método o la propiedad no contienen implementación.

Los métodos abstractos tienen las siguientes características:

  • Un método abstracto es, implícitamente, un método virtual.

  • Solo se permiten declaraciones de métodos abstractos en clases abstractas.

  • Dado que una declaración de método abstracto no proporciona una implementación real, no hay ningún cuerpo de método; la declaración de método finaliza simplemente con un punto y coma y no hay llaves ({ }) después de la firma. Por ejemplo:

    public abstract void MyMethod();  
    

    La implementación la proporciona un método, override, que es miembro de una clase no abstracta.

  • Es un error usar los modificadores static o virtual en una declaración de método abstracto.

Las propiedades abstractas se comportan como métodos abstractos, salvo por las diferencias en la sintaxis de declaración e invocación.

  • Es un error usar el modificador abstract en una propiedad estática.

  • Una propiedad abstracta heredada se puede invalidar en una clase derivada incluyendo una declaración de propiedad que use el modificador override.

Para obtener más información sobre las clases abstractas, vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#).

Una clase abstracta debe proporcionar implementación para todos los miembros de interfaz.

Una clase abstracta que implemente una interfaz podría asignar los métodos de interfaz a métodos abstractos. Por ejemplo:

interface I
{
    void M();
}

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

Ejemplo 2

En este ejemplo, la clase DerivedClass se deriva de una clase abstracta BaseClass. La clase abstracta contiene un método abstracto, AbstractMethod, y dos propiedades abstractas, X y 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

En el ejemplo anterior, si intenta crear una instancia de la clase abstracta mediante una instrucción como esta:

BaseClass bc = new BaseClass();   // Error  

Se mostrará un mensaje de error en el que se indica que el compilador no puede crear una instancia de la clase abstracta "BaseClass".

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Consulte también