jueves, 4 de junio de 2009

Clases abstractas

Clases abstractas

La abstracción es un recurso de la mente (quizás el más característico de nuestra pretendida superioridad respecto del mundo animal). Por su parte, los lenguajes de programación permiten expresar la solución de un problema de forma comprensible simultáneamente por la máquina y el humano. Constituyen un puente entre la abstracción de la mente y una serie de instrucciones ejecutables por un dispositivo electrónico. En consecuencia, la capacidad de abstracción es una característica deseable de los lenguajes artificiales, pues cuanto mayor sea, mayor será su aproximación al lado humano. Es decir, con la imagen existente en la mente del programador. En este sentido, la introducción de las clases en los lenguajes orientados a objetos ha representado un importante avance respecto de la programación tradicional y dentro de ellas, las denominadas clases abstractas son las que representan el mayor grado de abstracción.

De hecho, las clases abstractas presentan un nivel de "abstracción" tan elevado que no sirven para instanciar objetos de ellas. Representan los escalones más elevados de algunas jerarquías de clases y solo sirven para derivar otras clases, en las que se van implementando detalles y concreciones, hasta que finalmente presentan un nivel de definición suficiente que permita instanciar objetos concretos. Se suelen utilizar en aquellos casos en que se quiere que una serie de clases mantengan una cierta característica o interfaz común. Por esta razón a veces se dice de ellas que son solo interfaz

Resulta evidente en el ejemplo de la figura que los diversos tipos de motores tienen características diferentes. Realmente tienen poco en común un motor eléctrico de corriente alterna y una turbina de vapor. Sin embargo, la construcción de una jerarquía en la que todos motores desciendan de un ancestro común, la clase abstracta "Motores", presenta la ventaja de unificar la interfaz. Aunque evidentemente su definición será tan "abstracta", que no pueda ser utilizada para instanciar directamente ningún tipo de motor. El creador del lenguaje dice de ellas que soportan la noción de un concepto general del que solo pueden utilizarse variantes más concretas [2].

Clases abstractas

Una clase abstracta es la que tiene al menos una función virtual pura (como hemos visto, una función virtual es especificada como "pura" haciéndola igual a cero.

Nota: recordemos que las clases que tienen al menos una función virtual (o virtual pura) se denominan clases polimórficas. Resulta por tanto, que todas las clases abstractas son también polimórficas, pero no necesariamente a la inversa.

Una clase abstracta solo puede ser usada como clase base para otras clases, pero no puede ser instanciada para crear un objeto.

Una clase abstracta no puede ser utilizada como argumento o como retorno de una función.

Si puede declararse punteros-a-clase abstracta.

Se permiten referencias-a-clase abstracta, suponiendo que el objeto temporal no es necesario en la inicialización.

Ejemplo


class Figura { // clase abstracta (CA)
point centro;
...
public:
getcentro() { return center; }
mover(point p) { centro = p; dibujar(); }
virtual void rotar(int) = 0; // función virtual pura
virtual void dibujar() = 0; // función virtual pura
virtual void brillo() = 0; // función virtual pura
...
};
...
Figura x; // ERROR: intento de instanciar una CA
Figura* sptr; // Ok: puntero a CA.
Figura f(); // ERROR: función NO puede devolver tipo CA.
int g(Figura s); // ERROR: CA NO puede ser argumento de función
Figura& h(Figura&); // Ok: devuelve tipo "referencia-a-CA"
int h(Figura&); // Ok: "referencia-a-CA" si puede ser argumento



No hay comentarios:

Publicar un comentario