abstract (Referencia de C#)

El modificador abstract indica que el elemento objeto de la modificación tiene una implementación incompleta o que le falta una implementación. El modificador abstract se puede usar con clases, métodos, propiedades, indizadores y eventos. Use el modificador abstract en una declaración de clase para indicar que la clase sólo se puede utilizar como clase base de otras clases. Los miembros que están marcados como abstractos o que se incluyen en una clase abstracta, deben ser implementados por clases derivadas de la clase abstracta.

Ejemplo

En este ejemplo, la clase Square debe proporcionar una implementación de Area porque deriva de ShapesClass:


abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int side = 0;

    public Square(int n)
    {
        side = n;
    }
    // Area method is required to avoid
    // a compile-time error.
    public override int Area()
    {
        return side * side;
    }

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

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

}
// Output: Area of the square = 144

Las clases de tipo abstract presentan 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 se puede modificar una clase abstracta con el modificador sealed (Referencia de C#) porque los dos modificadores tienen significados opuestos. El modificador sealed evita la herencia de una clase y el modificador abstract requiere la herencia de una clase.

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

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

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

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

  • Las declaraciones de métodos abstractos sólo se permiten en clases abstractas.

  • Debido a que una declaración de método abstracto no proporciona una implementación, no existe cuerpo del método; la declaración de método finaliza simplemente con un punto y coma y sin llaves ({ }) después de la firma. Por ejemplo:

    public abstract void MyMethod();
    

    La implementación la proporciona un método de reemplazooverride (Referencia de C#), que es miembro de una clase no abstracta.

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

Las propiedades abstractas funcionan como los métodos abstractos, salvo las diferencias en la sintaxis de las declaraciones y llamadas.

  • Es incorrecto utilizar el modificador abstract para una propiedad estática.

  • Una propiedad abstracta heredada se puede reemplazar en una clase derivada si se incluye una declaración de propiedad que utilice 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#) y Diseño de clases abstractas.

Una clase abstracta debe proporcionar implementaciones para todos los miembros de la interfaz.

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

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

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 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

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

BaseClass bc = new BaseClass();   // Error

se obtendrá un error que 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, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

Modificadores (Referencia de C#)

virtual (Referencia de C#)

override (Referencia de C#)

Palabras clave de C#

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#