Tabla de Contenidos

Herencia: Clases Abstractas

Si queremos que una clase no pueda ser instanciada hemos visto que basta con definir sus constructores como private, de forma que nunca podrán ser invocados. Esto es lo que ocurre con el constructor de la clase Math.

Existen otro tipo de clases que no se pueden instanciar ni tampoco acceder a sus métodos: estas son las clases abstractas.

Definición de Clase Abstracta

Una clase abstracta se crea únicamente para ser heredada por otras clases, y no se permite instanciar.

Además, permite definir métodos abstractos. De este modo una clase abstracta ofrece una implementación parcial de la clase, obligando a que sus subclases terminen de definir la implementación completa.

Ejemplo: Podemos tener un tipo que representa Vehículos, tienen unas propiedades comunes, y que engloba a muchos subtipos como Coche, Moto, Bicicleta, Barco, Tren, Avión, etc. Tener un elemento de tipo vehículo puede ser demasiado general y no tener mucho sentido propio. Sin embargo, puede definir una serie de operaciones que queremos asegurar que pueden realizar todos los tipos de vehículos, elementos que sí nos interesaría instanciar, y tendrían un mayor sentido propio. Todos los vehículos pueden realizar ciertas operaciones del mismo modo y además podemos asegurarnos de que cada uno define otras operaciones de forma específica: moverse, acelerar o parar, ya que cada uno lo hace de distinta forma.

Características

En resumen, una clase abstracta solo se usa para ser heredada, tenga métodos abstractos o no. Un clase que tiene al menos un método abstracto, debe ser definida como abstracta.

Declarar un Método Abstracto

Es un método que nunca va a poder ser ejecutado, ya que no tiene código (implementación). La subclase está obligado a sobrescribirlo si se quiere ser ejecutado. Se define como abstract :

[modificador] abstract tipoDevuelto nombreMetodo([parametros]);
 
public abstract boolean arrancar();

Declarar una Clase Abstracta

Para declarar una clase como abstracta se usa la palabra clase abstract :

public abstract class Vehiculo{
   //atributos
   ...
 
   //métodos abstractos
   public abstract boolean arrancar();
 
   public abstract void acelerar(int intensidad);
 
   public abstract void frenar(int intensidad);
}

Variables de Referencia

Crear una clase abstracta tiene como finalidad acceder polimórficamente a objetos de sus subclases: Puedo crear una variable del tipo de una clase Abstracta, pero nunca podré crear un objeto de una clase abstracta.

Es decir, las variables del tipo de una clase abstracta, solo podrán almacenar objetos de las subclases concretas (no abstractas) de esa clase abstracta de la que heredan.

Vehiculo miVehiculo;
 
miVehiculo = new Vehiculo() // Error: no se puede instanciar
 
//Pero la puedo usar para contener objetos de subclases
miVehiculo = new Coche();
miVehiculo.arrancar();

En base a este último apartado podemos concluir que el uso de clases abstractas está completamente ligado al concepto y uso del polimorfismo


© 2024 Fernando Valdeón