..
El polimorfismo es una técnica de programación que permite el uso de partes del código fuente, mientras se mantiene constante, para generar en tiempo de ejecución comportamientos.
Creación de código polimórfico tiene un significado específico en la programación orientada a objetos: que significa la creación de una taxonomía de todas las clases que implementan una interfaz.
Así que si, por ejemplo, mi interfaz define un método de "getArea", cada clase que implementa esta interfaz tendrá un "método getArea": esto nos permite escribir métodos polimórficos, métodos que pueden cambiar de ejecución del algoritmo Dependiendo del tipo de objeto que se pasa como argumento.
Polimorfismo en los idiomas de programación orientada a objetos tradicionales
En Java - pero el mismo es cierto para C + + y cualquier otro idioma, Orientada a Objetos (OO) ha terminado, entonces entregará el caso de Ruby - por ejemplo:
interfaz IFormaGeometrica
{
vacío getArea ();
}
Triángulo public class IFormaGeometrica
{
@ Override
pública getArea int ()
{
return (* this.base this.altezza) / 2;
}
}
En este caso se define la interfaz de IFormaGeometrica que establece que todos los objetos que "es" un getArea FormaGeometrica tendrá un método - como la clase de triángulo, que es un FormaGeometrica, tiene su propia implementación de getArea, lo que nos permite escribir un programa capaz de calcular el área de cualquier figura geométrica, ya sea que ya está presente en el código y que se llevará a cabo en el futuro, sin cambiar el código fuente original.
De hecho, si yo escribo una calculadora de clase:
Calculadora public final class
{
public static void main (String [] args)
{
Formularios de recogida de <IFormaGeometrica> =
<IFormaGeometrica> New ArrayList ();
forme.add (nuevo triángulo ());
forme.add (nueva plaza ());
forme.add (nuevo Pentágono ());
de (g IFormaGeometrica: formulario)
{
System.out.println (g.calcolaArea ());
}
}
}
Esto puede tomar como entrada cualquier colección de formas geométricas, a condición de que cada objeto de la colección debe implementar la interfaz IFormaGeometrica, y que tiene esencialmente un método getArea.
En este ejemplo, en Java es puramente académico: de hecho, probablemente en el constructor de cada clase, que incluirá medidas de entrada de los lados de la forma geométrica, la inclinación, y así sucesivamente.
El objetivo se logra: escribimos una clase que puede imprimir en el área de vídeo de cualquier forma geométrica. Repito: este es el código que ya se ha implementado (como en el caso del triángulo), que se está aplicando en el futuro.
No sólo eso: si la aplicación del cálculo del área del Triángulo contenía un error, que puede cambiar la clase sin tener que reescribir la Calculadora de Triángulo de clase. Tal vez fue desplegado en un servidor que tiene que reiniciar todos los cambios: en este caso no tener que cambiar el código es una gran ventaja. Pero aparte de eso, siempre es conveniente limitar las partes de código que "el cambio", porque cada cambio trae consigo posibles errores. Por el contrario, es una buena práctica de programación para saber siempre con certeza qué partes del código que se mantienen sin cambios.
Lo que ocurre "entre bastidores" es que el compilador se asegura de que cada objeto en el código polimórfico del método principal de la calculadora de clase implementa la interfaz. De esta manera, dicen, es una expresión que utiliza la metodología de diseño por contrato ", el contrato se respeta".
Si no, si es que en las "formas" tener un objeto de una clase que no íbamos a poner en práctica IFormaGeometrica un error en tiempo de compilación, o no logra ejecutar el programa, ya que el compilador se daría cuenta del error.
Polimorfismo en Rubí
Pero lo que sucede en Ruby? Y 'posible en Ruby, que no se compila, pero el lenguaje interpretado, escrito métodos polimórficos?
Sí, es ciertamente posible, pero hay una gran diferencia "filosófica" de lenguajes orientados a objetos y compilado, lo que
Podríamos describirla. OO de programación en Java y clásico, para establecer que un objeto pertenece a un tipo particular de objetos (que implementa una interfaz determinada) deben oponerse expresamente a derivar de una clase dominante: básicamente, es necesario utilizar las técnicas de la herencia (herencia por una clase, una clase abstracta o una interfaz).
Sería como decir: Para determinar si se trata de un pato delante de mí, me tomo el ADN y el estudio en el laboratorio para ver si es pato.
En Ruby se utiliza la "prueba del pato" (prueba de pato) inventado por James Riley (ver http://en.wikipedia.org/wiki/Duck_typing ):
si camina como un pato y grazna como un pato, entonces es un pato.
(Que por cierto es lo que hace cada uno de nosotros cuando ve a un pato).
¿Qué significa esto? Esto significa que en Ruby, y más generalmente en lenguajes de programación orientada a objetos, así como Python y Perl, no es necesario especificar la interfaz, ni relaciones explícitas herencia entre clases.
El intérprete simplemente "confianza" que el programador, el método de pasos cuando un objeto polimórfico que "debería haber" una cierta manera, que en realidad tienen la extensión.
| |
Ruby y Ruby on Rails (Curso)
Crear aplicaciones de software y la Web con Ruby y RoR. A partir de 39 €. |