Capitulo 8 – Entendiendo el Polimorfismo (Parte I)

Buenas tardes, hoy comenzamos con el Capitulo 8, el cual trata sobre otro de los principios fundamentales en los lenguajes de programación orientados a objetos. El capítulo se compone de 2 partes:

  • Polymorphism (Polimorfismo)
  • Practical examples of Polymorphism (Ejemplos prácticos del Polimorfismo)

Polymorphism (Polimorfismo)

EL objetivo de esta parte es la descripción del polimorfismo y como se aplica a las clases e interfaces, y describir y aplicar el principio de “Program to a interface” o programar una interface.

El polimorfismo es un aspecto fundamental de los lenguajes de programación orientados a objetos. Java no es una excepción a esto. El polimorfismo permite al desarrollador escribir código que es mas genérico. El código genérico es mas flexible y permite una facil reutilización del código, otro principio fundamental de la orientación a objetos. El concepto de programar una interface es una manifestación del polimorfismo. Cuando un desarrollador programa una interface, se usa el polimorfismo. El desarrollador especifica la interfaz que está esperando en vez de los objetos actuales. Esto permite a cualquier objeto ser usado con el código tanto como se implemente la interface esperada.
En esta sección exploraremos como trabaja el polimorfismo, y que permite hacer al desarrollador. Este capítulo también examina el concepto de la programación de una interface.

Polymorphism (Polimorfismo

La palabra polimorfismo viene del Griego y signifuca “Multiples formas”. En Java, el polimorfismo significa que un objeto puede tomar la forma, o el lugar de un objeto de diferente tipo. El polimorfismo puede existir cuando una clase hereda de otra. Esto tambien existe cuando una clase implementa una interface. Esta sección describe como el polimorfismo se puede aplicar en ambos casos. Finalmente, esta sección como el polimorfismo se demuestra en el código de Java. Los siguientes puntos serán discutidos:

  • Polymorphism via class inheritance (Polimorfisfo en la herencia de clases)
  • Polymorphism via implementing interfaces (Polimorfismo implementando interfaces)
  • Polymorphism in code (Polimorfismo en el código)
Polymorphism via class Inheritance

El polimorfismo ocurre cuando un cierto tipo de objeto es necesitado y otro objheto de ese tipo o otro mas específico es aceptado en su lugar. Recordemos que un objeto es de un tipo mas específico que otro cuando este ha heredado de otro mas general. Por ejemplo, un método puede requerir un objeto Human. Cuando las clases CHild y Adult heredan de la clase Human, cada una de estas clases poseerían toda la funcionalidad del objeto Human, además de más funcionalidad acorde a sus edades. Los objetos Child y Adult tienen todos los métodos que el objeto human tiene porque lo han ganado debido a la herencia.
Por lo tanto, Chuld y Adult satisfacerían cualquier operación que requiera el objeto Human. Esto podría continuar además con las clases Shannon y Colleen que tendrían las funcionalidades mas generales de las clases Adult y Human, y pueden ser usadas en cualquier lugar donde un objeto Human o Adult se necesite.
El polimorfismo usa al relación “es-un” o “is-a”. En la figura siguiente el objeto Child es un objeto Human, y el objeto Adult es un objeto Human. Esto es igual con el objeto Colleen. El objeto Shannoon no es solo un tipo específico de objeto Adult, sino que tambien un tipo mas específico de un objeto del cual es subclase. La relación “es-un” se crea cuando un objeto hereda deo tro. Cualquier objeto que extiende a otro objeto se puede decir que tiene una relación “es-un” del objeto del cual ha eredado. Cualquier objeto que tiene una relación “is-an” o “es-un” con otros puede polimorficamente ser usado como el otro objeto.
Cuando un objeto es polimorficamente usado como otro objeto, el objeto mas específico está restringido a solo usar la interface pública del objeto mas general.

En el anterior ejemplo, cuando el objeto Adult es usado como un objeto Human, solo los métodos que están disponibles en la clase Human pueden ser usados. Esto es porque el código Java que está usando el objeto Adult como el objeto Human no tiene conocimiento de que este objeto Human es realmente un objeto Adult. Este es el beneficio del polimorfismo. El código de Java no siempre tiene que ser consciente de la especificación de un objeto. Si un objeto general conoce las necesidades de un método, entonces a este método no le importa si es un objeto es mas general o es un objeto mas específico. El único requisito es que el objeto tenga una relación con el objeto que el método requiere.
La relación es unidireccional. Solo el objeto mas específico puede estar en lugar del objeto mas general. Por ejemplo, si se necesitara un objeto Adult, un objeto general como Human podría no proveer toda la funcionalidad que ofrece el objeto Human.

Polymorphism via Implementing interfaces

Las aplicaciones del polimorfismo no están limitadas a la herencia de clases. también pueden ser aplicadas a los obejtos de clases que implementan interfaces. Cuando una clase implementa una interface, es requerido que se implementen todos los métodos que contiene la interface. Haciendo esto, se da la garantía de que la clase tenga la funcionalidad que ofrece la interface. Esto permite a los objetos ser creados de estas clases para que polimorficamente se compartan como el tipo de dato de la interface.
Una interface llamada Display puede ser usada para clases que tengan la habilidad de mostrar texto en pantalla. Esta interface contiene 2 métodos. Un método muestra texto en pantalla, y otro es para recoger el texto que está siendo mostrado. Cualquier clase puede implementar esta interface demuestra que tiene la funcionalidad de Display. Implementando esta interface la clase requiere que se implementen todos los métodos que la interface contiene.
Desde que el objeto fuera creado de una clase que implementa la interface Display, se tiene la garantía de tener la funcionalidad de Display. Este objeto tiene una relación “es-un” o “is-a” Display. Este objeto puede ser enmascarado como un objeto del tipo Display. Un objeto puede actuar polimorficamentecomo cualquier interface que la clase o superclase implementen.

Polymorphism in Code

Cuando un objeto específico puede ser usado como otro objeto general polimorficamente, el objeto específico puede ser usado en lugar de aquello mas general siendo llamada.
Por ejemplo, si una clase TypeC es extendida por TypeB, y TypeB ha sido extendida de TypeA, siempre que un tipo de objeto de TypeA o TypeB sea necesitado, se puede usar TypeC. El siguiente segmento de código muestra un ejemplo de esto:

TypeA var1 = new TypeA();
TypeA var2 = new TypeB();
TypeA var4 = new TypeC();

TypeB var4 = new TypeB();
TypeB var5 = new TypeC();

TypeC var6 = new TypeC();

En este ejemplo cualquier subclase puede ser intercambiada con la superclase. la variable var3 es declarada como un objeto TypeA pero inicializado cmo un nuevo objeto TypeC. Aunque var3 es realmente un objeto TypeC será tratado como un objeto TypeA donde sea reefrenciado. Esto esta bien porque el objeto TypeC tiene heredada toda la funcionalidad del TypeA y TypeB. SIn embargo, desde que var3 fue declarado como TypeA, puede ser ahora tratado como un objeto de este tipo. Si el objeto TypeC tiene métodos adicionales que no sean partes de la clase TypeA, estos métodos no estarán disponibles.
Mas comunmente el polimorfismo será usado por los argumentos del método. Esto permite a un método aser escrito mas abstractamente y por tanto ser mas flexible. Por ejemplo, un método puede ser requerido para aceptar un tipo de objeto Animal como argumento y usarlo para determinar si el animal está hambriento. en este escenario, no hay beneficio en crear un método que aceptara un objeto Penguin y otro que acepte un objeto PolarBear. Sin embargo, sería mejor diseñar un método que acepte la clase Animal. El nivel de hamber es general para la clase Animal. La clase Animal es una superclase para la clase Penguin y PolarBear.
Esto son ejemplos básicos para ayudar a conocer los conceptos de polimorfismo.

Programming to an Interface

La programación de una interface es un concepto que el código debería interactuar basado en un set definido de funcionalidad en vez de un tipo de objeto expícitamente definido. En otras palabras, es mejor para las interfaces públicas de los objetos que usen tipos de dato que han sido definidos como interfaces en oposición a una clase particular cuando sea posible. Cuando un objeto está implementando una interface, está declarando que tiene un set exacto de funcionalidades. Otras clases pueden implementar la misma interface y proveer esta funcionalidad.
Un método que usa una interface como un tipo de argumento permite a cualquier objeto, sin contar el tipo que sea, a ser usado tanto como se implemente la interface. Esto permite al código ser mas abstracto y flexible. También promociona la reutilización del código.

Hasta aquí la parte teórica del polimorfismo, en la siguiente parte traeré casos practicos con ejemplos para que sepamos verlo mas rápidamente, y con ello tambien entenderlo mejor, ya que es un tema difícil de explicar teóricamente, y lo mejor es ver buenos ejemplos para afianzar los conocimientos.

Cualquier corrección o aporte es bienvenido.

Saludos!!!