====== 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 =====
* Una clase que tiene un ''método abstracto'', es obligatoriamente una ''clase abstracta''.
* Un ''método abstracto'' es un método que está declarado, pero no implementado. Solo tiene su nombre, parámetros, retorno y modificadores. (Pero no tiene código en su cuerpo)
* Una clase abtracta puede tener métodos implementados (no abstractos, sino concretos), __incluso puede no tener ningún método abstracto__.
* Una clase que hereda de una clase abstracta está obligada a implementar todos los métodos abstractos. Si no lo hace, esos métodos seguirán siendo abstractos, y la clase será también abstracta.
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__**
----
(c) {{date> %Y}} Fernando Valdeón