Primeros pasos con Java, polimorfismo

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

Hace unos días hablamos del concepto de herencia, y dejamos para más adelante la explicación de una de las ventajas que nos otorga este mecanismo, el polimorfismo.

El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple, morfismo= Formas , esto implica que un mismo Objeto puede tomar diversas formas.

A través del concepto de Herencia es posible ilustrar este comportamiento:
herenciacastEl poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor flexibilidad al momento de programar con Objetos, el término Polimorfismo también es asociado con un concepto llamado Late-Binding (Ligamiento Tardío), observe el siguiente fragmento de código:

<br /><%%KEEPWHITESPACE%%>     Figura a = new Circulo();<br /><%%KEEPWHITESPACE%%>     Figura b = new Triangulo();<br />

Inicialmente se podríamos pensar que este código generaría un error debido a que el tipo de referencia es distinto al de la instancia del objeto, sin embargo, el fragmento anterior es correcto y demuestra el concepto de Polimorfismo.

En el ejemplo anterior, tanto el objeto del tipo Circulo como el del tipo Triangulo adquieren las características de la figura, y posteriormente incluyen otras propias.

Por ejemplo, toda figura tiene un área, por lo tanto es de entender que el objeto Figura tenga un método getArea(), del que luego tendríamos que indicar qué tipo de cálculos tendría que hacerse tanto en Circulo como en Triangulo para obtenerla. ¿Y si quisiéramos calcular el área de todas las figuras que hemos declarado? Sólo tendríamos que hacer un método que recibiera todas las figuras, con independencia del tipo de figura, y devolviera el total del área:

<br /><%%KEEPWHITESPACE%%>     Figura a = new Circulo(4); // Declaramos un nuevo círculo de radio 4.<br /><%%KEEPWHITESPACE%%>     Figura b = new Triangulo(4, 2); // Declaramos nuevo triángulo con base 4 y altura 2.<br /><%%KEEPWHITESPACE%%>     Figura[] figuras = {a, b}; // Array de figuras, objeto contenedor de figuras.<br /><br /><%%KEEPWHITESPACE%%>     calcularAreaTotal(figuras);<br />

Y nuestro método “calcularAreaTotal” lo que haría sería lo siguiente:

<br /><%%KEEPWHITESPACE%%>     public float calcularAreaTotal(Figura[] figuras) {<br /><%%KEEPWHITESPACE%%>          float area = 0;<br /><%%KEEPWHITESPACE%%>          for(Figura tmp : figuras) // Bucle for-each, por cada Figura que hay en el contenedor figuras,<br /><%%KEEPWHITESPACE%%>                                    // lo guardamos en la variable tmp y entramos en el bucle.<br /><%%KEEPWHITESPACE%%>               area += tmp.getArea(); // Aumentamos el valor de area con el valor de la figura.<br /><br /><%%KEEPWHITESPACE%%>          return area; // Devolvemos el total del área de todas las figuras.<br /><%%KEEPWHITESPACE%%>     }<br />

Esto nos va a facilitar tratar todas nuestras figuras como de un sólo tipo, y nos ayuda a realizar ciertas funciones de forma mas sencilla. En el ejemplo hemos utilizado un array, este concepto lo desarrollaremos más a fondo en futuras entradas.

El uso de Polimorfismo posee ciertos detalles que no fueron descritos en el ejemplo anterior, uno de estos, que también tiene implicaciones en otros componentes es: Casting.

Uso de “Casting”

El termino “Casting” viene de la palabra “Cast” que significa Molde, por lo que el termino literal es Hacer un Molde, en Polimorfismo se lleva acabo este proceso de “Casting” implícitamente, una Guitarra se coloca en el molde de un Instrumento, un Triangulo en el molde de una Figura, sin embargo, en ciertas ocasiones se requiere realizar un tipo de “Casting” que no es considerado seguro en términos computacionales.

Anteriormente se mencionó que el “Casting” llevado acabo con Polimorfismo es implícito, esto se debe a que no se requiere de sintaxis especial, simplemente se convierte un Circulo a una Figura, sin embargo, para llevar una transformación en sentido opuesto se requiere de sintaxis adicional para mantener la seguridad de transformación; analicemos: mientras se puede asegurar que un Triangulo es una Figura (“Up-Casting”), una Figura no necesariamente es un Triangulo, claro esta que lo puede ser, pero en Java se requiere definir explícitamente esta operación (“Down-Casting”).

Pondremos un ejemplo de casting. Imaginemos que diseñamos un programa en el que un usuario tiene que indicar su edad. Para ello diseñamos un campo en el que habilitamos que el usuario introduzca valores numéricos, sin embargo esto es una cadena de caracteres, que posteriormente tendremos que convertir en un entero para almacenarlo en nuestra base de datos. Para ello lo que haríamos sería leer la cadena de texto, y convertirla en un número entero, de manera que si el usuario ha introducido un 24, nosotros haríamos lo siguiente:

<br /><%%KEEPWHITESPACE%%>     Integer.parseInt(&amp;quot;24&amp;quot;);<br />

Integer es la clase que representa a los numeros enteros, y parseInt es el método que convierte un String a int.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

Deja un comentario