Resumen Capitulo 10 Como Programar en Java

10.2 Polimorfismo El polimorfismo ocurre cuando un programa invoca a un método a través de una variable de la superclase

Views 119 Downloads 0 File size 86KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

10.2 Polimorfismo El polimorfismo ocurre cuando un programa invoca a un método a través de una variable de la superclase; en tiempo de ejecución, se hace una llamada a la versión correcta del método de la subclase, con base en el tipo de la referencia almacenada en la variable de la superclase. Así, sin modificar el sistema (más que para crear nuevas clases y modificar el código 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 método para hacer que ocurran distintas acciones, dependiendo del tipo del objeto en el que se invoca el método. 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 ejecución se encargue de los detalles específicos. 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 jerarquía de herencia). El polimorfismo promueve la extensibilidad: el software que invoca el comportamiento polimórfico es independiente de los tipos de los objetos a los cuales se envían los mensajes. Se pueden incorporar en un sistema nuevos tipos de objetos que pueden responder a las llamadas de los métodos existentes, sin necesidad de modificar el sistema base. Sólo el código cliente que crea instancias de los nuevos objetos debe modificarse para dar cabida a los nuevos tipos. 10.3 Demostración del comportamiento polimórfico 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 más adelante en este capítulo, 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 relación “es un” se aplica sólo 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 explícitamente la referencia a la superclase al tipo de la subclase; una técnica que veremos con más detalle en la sección 10.5. ¿Para qué nos serviría, en un momento dado, realizar una asignación así? Una referencia a la superclase puede usarse para invocar sólo a los métodos declarados en la superclase; si tratamos de invocar métodos

que sólo pertenezcan a la subclase, a través de una referencia a la superclase, se producen errores de compilación. Si un programa necesita realizar una operación específica 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 técnica conocida como conversión descendente. Esto permite al programa invocar métodos de la subclase que no se encuentren en la superclase. En la sección 10.5 presentaremos un ejemplo concreto de conversión 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 método, se hace una llamada a la versión del método 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 métodos abstractos Como se utilizan sólo como superclases en jerarquías 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 están 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; sólo especifican lo que tienen en común las subclases. Necesitamos ser más específicos 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 más métodos abstractos. Un método abstracto tiene la palabra clave abstract en su declaración, como en public abstract void dibujar(); // método abstracto

Los métodos abstractos no proporcionan implementaciones. Una clase que contiene métodos abstractos debe declararse como clase abstracta, aun si esa clase contiene métodos concretos (no abstractos). Cada subclase concreta de una superclase abstracta también debe proporcionar implementaciones concretas de los métodos abstractos de la superclase. Los constructores y los métodos static no pueden declararse como abstract. Los constructores no se heredan, por lo que nunca podría implementarse un constructor abstract. Aunque los métodos static se heredan, no están asociados con objetos específicos de las clases que los declaran. Como el propósito de los métodos abstract es sobrescribirlos para procesar objetos con base en sus tipos, no tendría sentido declarar un método static como abstract. En especial, el polimorfismo es efectivo para implementar los denominados sistemas de software en capas. 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 o un objeto ArrayList.

Observación de ingeniería de software 10.4 Una subclase