abstract (Referencia de C#)abstract (C# Reference)

El modificador abstract indica que lo que se modifica carece de implementación o tiene una implementación incompleta.The abstract modifier indicates that the thing being modified has a missing or incomplete implementation. El modificador abstract puede usarse con clases, métodos, propiedades, indexadores y eventos.The abstract modifier can be used with classes, methods, properties, indexers, and events. 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.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. Los miembros marcados como abstractos deben implementarse con clases derivadas de la clase abstracta.Members marked as abstract must be implemented by classes that derive from the abstract class.

EjemploExample

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

Las clases abstractas tienen las siguientes características:Abstract classes have the following features:

  • No se pueden crear instancias de una clase abstracta.An abstract class cannot be instantiated.

  • Una clase abstracta puede contener descriptores de acceso y métodos abstractos.An abstract class may contain abstract methods and accessors.

  • No es posible modificar una clase abstracta con el modificador sealed porque los dos modificadores tienen significados opuestos.It is not possible to modify an abstract class with the sealed modifier because the two modifiers have opposite meanings. El modificador sealed impide que una clase se herede y el modificador abstract requiere que una clase se herede.The sealed modifier prevents a class from being inherited and the abstract modifier requires a class to be inherited.

  • 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.A non-abstract class derived from an abstract class must include actual implementations of all inherited abstract methods and accessors.

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.Use the abstract modifier in a method or property declaration to indicate that the method or property does not contain implementation.

Los métodos abstractos tienen las siguientes características:Abstract methods have the following features:

  • Un método abstracto es, implícitamente, un método virtual.An abstract method is implicitly a virtual method.

  • Solo se permiten declaraciones de métodos abstractos en clases abstractas.Abstract method declarations are only permitted in abstract classes.

  • 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.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 ejemplo:For example:

    public abstract void MyMethod();  
    

    La implementación la proporciona un método, override, que es miembro de una clase no abstracta.The implementation is provided by a method override, which is a member of a non-abstract class.

  • Es un error usar los modificadores static o virtual en una declaración de método abstracto.It is an error to use the static or virtual modifiers in an abstract method declaration.

Las propiedades abstractas se comportan como métodos abstractos, salvo por las diferencias en la sintaxis de declaración e invocación.Abstract properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • Es un error usar el modificador abstract en una propiedad estática.It is an error to use the abstract modifier on a static property.

  • Una propiedad abstracta heredada se puede invalidar en una clase derivada incluyendo una declaración de propiedad que use el modificador override.An abstract inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

Para obtener más información sobre las clases abstractas, vea Abstract and Sealed Classes and Class Members (Clases y miembros de clase abstractos y sellados [Guía de programación de C#]).For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Una clase abstracta debe proporcionar implementación para todos los miembros de interfaz.An abstract class must provide implementation for all interface members.

Una clase abstracta que implemente una interfaz podría asignar los métodos de interfaz a métodos abstractos.An abstract class that implements an interface might map the interface methods onto abstract methods. Por ejemplo:For example:

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

EjemploExample

En este ejemplo, la clase DerivedClass se deriva de una clase abstracta BaseClass.In this example, the class DerivedClass is derived from an abstract class BaseClass. La clase abstracta contiene un método abstracto, AbstractMethod, y dos propiedades abstractas, X y 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()
    {
        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:In the preceding example, if you attempt to instantiate the abstract class by using a statement like this:

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".You will get an error saying that the compiler cannot create an instance of the abstract class 'BaseClass'.

Especificación del lenguaje C#C# Language Specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also