Вы находитесь на странице: 1из 3

10.

2 Polimorfismo
El polimorfismo ocurre cuando un programa invoca a un mtodo a travs de una variable
de la superclase; en tiempo de ejecucin, se hace una llamada a la versin correcta del
mtodo de la subclase, con base en el tipo de la referencia almacenada en la variable de la
superclase.
As, sin modificar el sistema (ms que para crear nuevas clases y modificar el cdigo que
genera nuevos objetos), los programadores pueden utilizar el polimorfismo para incluir de
manera conveniente tipos adicionales que no se hayan considerado a la hora de crear el
sistema.
Con el polimorfismo podemos usar el mismo nombre y la misma firma del mtodo para
hacer que ocurran distintas acciones, dependiendo del tipo del objeto en el que se invoca el
mtodo. Esto proporciona al programador una enorme capacidad expresiva.
El polimorfismo permite a los programadores tratar con las generalidades y dejar
que el entorno en tiempo de ejecucin se encargue de los detalles especficos. Los
programadores pueden ordenar a los objetos que se comporten en formas
apropiadas para ellos, sin necesidad de conocer los tipos de los objetos (siempre y
cuando stos pertenezcan a la misma jerarqua de herencia).
El polimorfismo promueve la extensibilidad: el software que invoca el
comportamiento polimrfico es independiente de los tipos de los objetos a los
cuales se envan los mensajes. Se pueden incorporar en un sistema nuevos tipos de
objetos que pueden responder a las llamadas de los mtodos existentes, sin
necesidad de modificar el sistema base. Slo el cdigo cliente que crea instancias
de los nuevos objetos debe modificarse para dar cabida a los nuevos tipos.
10.3 Demostracin del comportamiento polimrfico
Un objeto de una subclase puede tratarse como un objeto de su superclase. Esto permite
varias manipulaciones interesantes. Un programa puede crear un arreglo de referencias a la
superclase, que se refieran a objetos de muchos tipos de subclases. Esto se permite, ya que
cada objeto de una subclase es un objeto de su superclase.
Como veremos ms adelante en este captulo, no podemos tratar a un objeto de la
superclase como un objeto de cualquiera de sus subclases, porque un objeto superclase no
es un objeto de ninguna de sus subclases.
La relacin es un se aplica slo de una subclase a sus superclases directas (e indirectas),
pero no viceversa.
El compilador de Java permite asignar una referencia a la superclase a una variable de la
subclase, si convertimos explcitamente la referencia a la superclase al tipo de la subclase;
una tcnica que veremos con ms detalle en la seccin 10.5. Para qu nos servira, en un
momento dado, realizar una asignacin as? Una referencia a la superclase puede usarse
para invocar slo a los mtodos declarados en la superclase; si tratamos de invocar mtodos

que slo pertenezcan a la subclase, a travs de una referencia a la superclase, se producen


errores de compilacin. Si un programa necesita realizar una operacin especfica para la
subclase en un objeto de la subclase al que se haga una referencia mediante una variable de
la superclase, el programa primero debe convertir la referencia a la superclase en una
referencia a la subclase, mediante una tcnica conocida como conversin descendente. Esto
permite al programa invocar mtodos de la subclase que no se encuentren en la superclase.
En la seccin 10.5 presentaremos un ejemplo concreto de conversin descendente.
Cuando una variable de la superclase contiene una referencia a un objeto de la subclase, y
esta referencia se utiliza para llamar a un mtodo, se hace una llamada a la versin del
mtodo de la subclase.
El compilador de Java permite este cruzamiento, ya que un objeto de una subclase es un
objeto de su superclase (pero no viceversa).
10.4 Clases y mtodos abstractos
Como se utilizan slo como superclases en jerarquas de herencia, nos referimos a ellas
como superclases abstractas. Estas clases no pueden utilizarse para instanciar objetos, ya
que como veremos pronto, las clases abstractas estn incompletas. Las subclases deben
declarar las piezas faltantes.
Las clases que pueden utilizarse para instanciar objetos se llaman clases concretas.
Las superclases abstractas son demasiado generales como para crear objetos reales; slo
especifican lo que tienen en comn las subclases. Necesitamos ser ms especficos para
poder crear objetos.
Para hacer una clase abstracta, sta se declara con la palabra clave abstract. Por lo general,
una clase abstracta contiene uno o ms mtodos abstractos. Un mtodo abstracto tiene la
palabra clave abstract en su declaracin, como en
public abstract void dibujar(); // mtodo abstracto

Los mtodos abstractos no proporcionan implementaciones. Una clase que contiene


mtodos abstractos debe declararse como clase abstracta, aun si esa clase contiene mtodos
concretos (no abstractos). Cada subclase concreta de una superclase abstracta tambin debe
proporcionar implementaciones concretas de los mtodos abstractos de la superclase. Los
constructores y los mtodos static no pueden declararse como abstract. Los constructores
no se heredan, por lo que nunca podra implementarse un constructor abstract. Aunque los
mtodos static se heredan, no estn asociados con objetos especficos de las clases que los
declaran. Como el propsito de los mtodos abstract es sobrescribirlos para procesar
objetos con base en sus tipos, no tendra sentido declarar un mtodo static como abstract.
En especial, el polimorfismo es efectivo para implementar los denominados sistemas de
software en capas.
En la programacin orientada a objetos es comn declarar una clase iteradora que pueda
recorrer todos los objetos en una coleccin, como un arreglo o un objeto ArrayList.

Observacin de ingeniera de software 10.4


Una subclase

Вам также может понравиться