jueves, 12 de agosto de 2010

Clases Abstractas


CLASE ABSTRACTA

Una de las características más útiles de cualquier lenguaje orientado a objetos es la posibilidad de declarar clases que definen como se utiliza solamente, sin tener que implementar método. Esto en Java se hace mediante interfaces y con clases abstractas.
Una clase abstracta es una clase de la que no se puede crear objetos. La utilidad de estas clases estriba en que otras clases hereden de ésta, por lo que con ello conseguiremos reutilizar código. Para declarar una clase como abstracta utilizamos la palabra clave abstract.
 
Una clase abstracta…

Es una clase que no se puede instanciar.
Se usa únicamente para definir subclases. 
¿Cuándo es una clase abstracta?
Cuando deseamos definir una abstracción que englobe objetos de distintos tipos  y queremos hacer uso del polimorfismo.
Polimorfismo: se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta.
 
abstract class FiguraGeometrica {
    . . .
    abstract void dibujar();
    . . .
}

class Circulo extends FiguraGeometrica {
    . . .
    void dibujar() {
        // codigo para dibujar Circulo
        . . .
    }

Se pueden crear referencias a clases abstractas como cualquier otra. No hay ningún problema en poner:

  FiguraGeometrica figura;

Sin embargo una clase abstracta no se puede instanciar, es decir, no se pueden crear objetos de una clase abstracta. El compilador producirá un error si se intenta:

  FiguraGeometrica figura = new FiguraGeometrica();

Esto es coherente dado que una clase abstracta no tiene completa su implementación y encaja bien con la idea de que algo abstracto no puede materializarse. Sin embargo utilizando el up-casting visto dedicado a la Herencia si se puede escribir:

FiguraGeometrica figura = new Circulo(. . .);
figura.dibujar();




Figura  es un clase abstracta que no tiene sentido calcular su área,  pero sí la de un cuadrado o un círculo. Si una subclase  de Figura no define area() debe declararse también como clase abstracta.

No hay comentarios:

Publicar un comentario