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