Una clase abstracta es aquella que forzosamente se ha de derivar si se
desea que se puedan crear objetos de la misma o acceder a sus miembros
estáticos (esto último se verá más adelante en este mismo tema) Para definir
una clase abstracta se antepone abstract a su definición, como se muestra en el siguiente ejemplo:
public abstract class A
{
public abstract
void F();
}
abstract public class B: A
{
public void G() {}
}
class C: B
{
public override
void F()
{}
}
Las clases A y B del
ejemplo son abstractas, y como puede verse es posible combinar en cualquier
orden el modificador abstract con
modificadores de acceso.
La utilidad de las clases
abstractas es que pueden contener métodos para los que no se dé directamente
una implementación sino que se deje en manos de sus clases hijas darla. No es
obligatorio que las clases abstractas contengan métodos de este tipo, pero sí
lo es marcar como abstracta a toda la que tenga alguno. Estos métodos se
definen precediendo su definición del modificador abstract y
sustituyendo su código por un punto y coma (;), como se muestra en
el método F() de la clase A del ejemplo (nótese que B
también ha de definirse como abstracta porque tampoco implementa el método F() que hereda de A)
Obviamente, como un método
abstracto no tiene código no es posible llamarlo. Hay que tener especial
cuidado con esto a la hora de utilizar this para llamar a otros métodos de un mismo
objeto, ya que llamar a los abstractos provoca un error al compilar.
Véase que todo método definido
como abstracto es implícitamente virtual, pues si no sería imposible
redefinirlo para darle una implementación en las clases hijas de la clase
abstracta donde esté definido. Por ello es necesario incluir el modificador override a la hora de darle implementación y es
redundante marcar un método como abstract y virtual
a la vez (de hecho, hacerlo provoca un error al compilar)
Es posible marcar un método como abstract
y override
a la vez, lo que convertiría al método en abstracto para sus clases hijas y
forzaría a que éstas lo tuviesen que reimplementar si no se quisiese que fuesen
clases abstractas.