Exportar (0) Imprimir
Expandir todo

10.5.6 Métodos abstractos

Visual Studio .NET 2003

Cuando una declaración de método de instancia incluye un modificador abstract, se dice que el método es un método abstracto. Aunque un método abstracto es también implícitamente un método virtual, no puede tener el modificador virtual.

Una declaración de método abstracto introduce un nuevo método virtual pero no proporciona una implementación del método. En cambio, es necesario que las clases derivadas no abstractas proporcionen su propia implementación mediante el reemplazo del método. Debido a que un método abstracto no proporciona una implementación real, el cuerpo-del-método de un método abstracto consiste simplemente en un punto y coma.

Las declaraciones de métodos abstractos sólo se permiten en clases abstractas (Sección 10.1.1.1).

En el ejemplo

public abstract class Shape
{
   public abstract void Paint(Graphics g, Rectangle r);
}
public class Ellipse: Shape
{
   public override void Paint(Graphics g, Rectangle r) {
      g.DrawEllipse(r);
   }
}
public class Box: Shape
{
   public override void Paint(Graphics g, Rectangle r) {
      g.DrawRect(r);
   }
}

la clase Shape define la noción abstracta de un objeto de forma geométrica que puede dibujarse él mismo. El método Paint es abstracto porque no existe una implementación predeterminada significativa. Las clases Ellipse y Box son implementaciones Shape concretas. Ya que estas clases no son abstractas, son necesarias para reemplazar el método Paint y proporcionar una implementación real.

Supone un error en tiempo de compilación que un acceso-base (Sección 7.5.8) haga referencia a un método abstracto. En el ejemplo

abstract class A
{
   public abstract void F();
}
class B: A
{
   public override void F() {
      base.F();                  // Error, base.F is abstract
   }
}

se produce un error en tiempo de compilación en la llamada base.F() debido a que hace referencia a un método abstracto.

Una declaración de método abstracto puede reemplazar un método virtual. Esto permite que una clase abstracta fuerce una nueva implementación del método en las clases derivadas, e impide la disponibilidad de la implementación original del método. En el ejemplo

using System;
class A
{
   public virtual void F() {
      Console.WriteLine("A.F");
   }
}
abstract class B: A
{
   public abstract override void F();
}
class C: B
{
   public override void F() {
      Console.WriteLine("C.F");
   }
}

la clase A declara un método virtual, la clase B reemplaza este método con un método abstracto y la clase C reemplaza el método abstracto para proporcionar su propia implementación.

Mostrar:
© 2014 Microsoft