424

Capítulo 10 Programación orientada a objetos: polimorfi smo

Observación de ingeniería de software 10.3

Una clase abstracta declara los atributos y comportamientos comunes de las diversas clases en una jerarquía de clases. 
Por lo general, una clase abstracta contiene uno o más métodos abstractos, que las subclases deben sobrescribir, si 
van a ser concretas. Las variables de instancia y los métodos concretos de una clase abstracta están sujetos a las reglas 
normales de la herencia,

Error común de programación 10.1

Tratar de instanciar un objeto de una clase abstracta es un error de compilación.

Error común de programación 10.2

Si no se implementan los métodos abstractos de la superclase en una clase derivada, se produce un error de compila-
ción, a menos que la clase derivada también se declare como 

abstract

.

Aunque no podemos instanciar objetos de superclases abstractas, pronto veremos que 

podemosusar super-

clases abstractas para declarar variables que puedan guardar referencias a objetos de cualquier clase concreta que 
se derive de esas superclases abstractas. Por lo general, los programas utilizan dichas variables para manipular los 
objetos de las subclases mediante el polimorfi smo. Además, podemos usar los nombres de las superclases abstrac-
tas para invocar métodos 

static

 que estén declarados en esas superclases abstractas.

Considere otra aplicación del polimorfi smo. Un programa de dibujo necesita mostrar en pantalla muchas 

fi guras, incluyendo nuevos tipos de fi guras que el programador agregará al sistema después de escribir el progra-
ma de dibujo. Este programa podría necesitar mostrar fi guras, como 

Circulos

,

Triangulos

,

Rectangulos

 u 

otras, que se deriven de la superclase abstracta 

Figura

. El programa de dibujo utiliza variables de 

Figura

 para 

administrar los objetos que se muestran en pantalla. Para dibujar cualquier objeto en esta jerarquía de herencia, el 
programa de dibujo utiliza una variable de la superclase 

Figura

 que contiene una referencia al objeto de la sub-

clase para invocar al método 

dibujar

 del objeto. Este método se declara como 

abstract

 en la superclase 

Figura

,

por lo que cada subclase concreta 

debe implementar el método 

dibujar

 en una forma que sea específi ca para esa 

fi gura. Cada objeto en la jerarquía de herencia de 

Figura

 sabe cómo dibujarse a sí mismo. El programa de dibujo 

no tiene que preocuparse acerca del tipo de cada objeto, o si ha encontrado objetos de ese tipo.

En especial, el polimorfi smo es efectivo para implementar los denominados sistemas de software en capas. 

Por ejemplo, en los sistemas operativos cada tipo de dispositivo físico puede operar en forma muy distinta a los 
demás. Aun así, los comandos para leer o escribir datos desde y hacia los dispositivos pueden tener cierta unifor-
midad. Para cada dispositivo, el sistema operativo utiliza una pieza de software llamada controlador de dispositi-
vos para controlar toda la comunicación entre el sistema y el dispositivo. El mensaje de escritura que se envía a un 
objeto controlador de dispositivo necesita interpretarse de manera específi ca en el contexto de ese controlador, y 
la forma en que manipula a un dispositivo de un tipo específi co. No obstante, la llamada de escritura en sí no es 
distinta a la escritura en cualquier otro dispositivo en el sistema: colocar cierto número de bytes de memoria en 
ese dispositivo. Un sistema operativo orientado a objetos podría usar una superclase abstracta para proporcionar 
una “interfaz” apropiada para todos los controladores de dispositivos. Después, a través de la herencia de esa 
superclase abstracta, se forman clases derivadas que se comporten todas de manera similar. Los métodos del con-
trolador de dispositivos se declaran como métodos abstractos en la superclase 

abstract

. Las implementaciones 

de estos métodos abstractos se proporcionan en las subclases que corresponden a los tipos específi cos de contro-
ladores de dispositivos. Siempre se están desarrollando nuevos dispositivos, a menudo mucho después de que 
se ha liberado el sistema operativo. Cuando usted compra un nuevo dispositivo, éste incluye un controlador de 
dispositivo proporcionado por el distribuidor. El dispositivo opera de inmediato, una vez que usted lo conecta a la 
computadora e instala el controlador de dispositivo. Éste es otro elegante ejemplo acerca de cómo el polimorfi smo 
hace que los sistemas sean extensibles.

En la programación orientada a objetos es común declarar una 

clase iteradora

 que pueda recorrer todos 

los objetos en una colección, como un arreglo (capítulo 7) o un objeto 

ArrayList

 (capítulo 19, Colecciones). 

Por ejemplo, un programa puede imprimir un arreglo 

ArrayList

 de objetos creando un objeto iterador, y luego 

usándolo para obtener el siguiente elemento de la lista cada vez que se llame al iterador. Los iteradores se utilizan 
comúnmente en la programación polimórfi ca para recorrer una colección que contiene referencias a objetos de 
diversos niveles de una jerarquía. (El capítulo 19 presenta un tratamiento detallado de 

ArrayList

, los iteradores 

y las capacidades “genéricas”). Por ejemplo, un arreglo 

ArrayList

 de objetos de la clase 

FiguraBidimensional

10_MAQ_CAP_10.indd424

4/19/081:25:14AM