1 / 31

Variables polimórficas (plantillas): definición, uso y aplicación

Variables polimórficas (plantillas): definición, uso y aplicación . Polimorfismo: es la capacidad que tiene los objetos de comportarse de múltiples formas. Polimorfismo: Upcasting Únicamente tienen sentido por la existencia de la herencia.

aneko
Download Presentation

Variables polimórficas (plantillas): definición, uso y aplicación

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Variables polimórficas (plantillas): definición, uso y aplicación

  2. Polimorfismo: es la capacidad que tiene los objetos de comportarse de múltiples formas. Polimorfismo: Upcasting Únicamente tienen sentido por la existencia de la herencia. ¨El polimorfismo (o upcasting) consiste en la posibilidad de que una referencia a objetos de una clase pueda conectarse también con objetos de descendientes de ésta.

  3. El sentido del polimorfismo es realizar una generalización, olvidar los detalles concretos de uno o varios objetos de distintas clases y buscar un punto común a todos ellos en un ancestro Se trata de algo que realiza comúnmente la mente humana durante el proceso de Razonamiento.

  4. Las conexiones polimórficas se realizan a veces de manera implícita en el paso de argumentos a una operación. Puede contener referencias a objetos de diferentes clases. El polimorfismo hace posible que un usuario pueda añadir nuevas clases a una jerarquía sin modificar o recompilar el código escrito en términos de la clase base.

  5. Permite programar a nivel de clase base utilizando objetos de clases derivadas Se puede clasificar el polimorfismo en dos grandes clases: Polimorfismo dinámico (o polimorfismo paramétrico) es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.

  6. Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados.

  7. El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación genérica. También se clasifica en herencia por redefinición de métodos abstractos y por método sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros.

  8. VARIABLES POLIMÓRFICAS (Ejemplos)

  9. En términos de programación, el polimorfismo permite que un solo nombre de clase o de método represente diferente código seleccionado mediante algún mecanismo automático. • De esta forma, puesto que un nombre puede representar diferente código, también puede representar muchos comportamientos distintos. • Un lenguaje que acepta el polimorfismo es un lenguaje polimórfico. • Un lenguaje monomórfico no acepta el polimorfismo, está restringido a un comportamiento estático, porque cada nombre está ligado en forma estática a su código.

  10. ObjetoPersonalidad.java publicclassObjetoPersonalidad { publicString hablar() { return "Soy un objeto."; } }

  11. ObjetoPesimista.javaObjetoOptimista.java publicclassObjetoPesimistaextendsObjetoPersonalidad { publicString hablar() { return "El vaso está medio vacio."; } } publicclassObjetoOptimistaextendsObjetoPersonalidad { publicString hablar() { return "El vaso está medio lleno."; } }

  12. ObjetoIntrovertido.javaObjetoExtrovertido.java publicpublicclassObjetoIntrovertidoextendsObjetoPersonalidad { publicString hablar() { return “Hola."; } } publicclassObjetoExtrovertidoextendsObjetoPersonalidad { publicString hablar() { return "Hola, bla, bla, bla, sabías que bla, bla, bla."; } }

  13. ObjetoPersonalidad.java • Estas clases conforman una jerarquía de herencia. • La clase base, ObjetoPersonalidad, declara un método: hablar(). • Cada subclase redefine hablar() y devuelve su propio mensaje con base en su personalidad. • La jerarquía establece relaciones de sustituibilidad entre los subtipos y su madre.

  14. EjemploPersonalidad.java publicclassEjemploPersonalidad { publicstaticvoidmain( String [] args ) { ObjetoPersonalidad personalidad = new ObjetoPersonalidad(); ObjetoPesimista pesimista = new ObjetoPesimista(); ObjetoOptimista optimista = new ObjetoOptimista(); ObjetoIntrovertido introvertido = new ObjetoIntrovertido(); ObjetoExtrovertido extrovertido = new ObjetoExtrovertido(); // la sustituibilidad permite hacer lo siguiente ObjetoPersonalidad [] personalidades = new ObjetoPersonalidad[5]; personalidades[0] = personalidad; personalidades[1] = pesimista; personalidades[2] = optimista; personalidades[3] = introvertido; personalidades[4] = extrovertido;

  15. EjemploPersonalidad.java // el polimorfismo hace que el ObjetoPersonalidad parezca tener muchos comportamientos distintos System.out.println( "El ObjetoPersonalidad[0] habla: " + personalidades[0].hablar()); System.out.println( "El ObjetoPersonalidad[1] habla: " + personalidades[1].hablar()); System.out.println( "El ObjetoPersonalidad[2] habla: " + personalidades[2].hablar()); System.out.println( "El ObjetoPersonalidad[3] habla: " + personalidades[3].hablar()); System.out.println( "El ObjetoPersonalidad[4] habla: " + personalidades[4].hablar()); } }

  16. EjemploPersonalidad.java • El resultado de la ejecución es el siguiente: El ObjetoPersonalidad[0] habla: Soy un objeto. El ObjetoPersonalidad[1] habla: El vaso está medio vacío. El ObjetoPersonalidad[2] habla: El vaso está medio lleno. El ObjetoPersonalidad[3] habla: Hola. El ObjetoPersonalidad[4] habla: Hola, bla, bla, bla, sabías que bla, bla, bla. Processexitedwithexitcode 0.

  17. EjemploPersonalidad.java • El método hablar() de ObjetoPersonalidad tiene muchos comportamientos distintos. Aun cuando ObjetoPersonalidad define que hablar() imprima “Soy un objeto.”, ObjetoPersonalidad exhibe más de un comportamiento. • Cada instancia de ObjetoPersonalidad se comporta de manera distinta cuando el main() llama al método hablar().

  18. EjemploPersonalidad.java • Ésta es la esencia del comportamiento polimórfico; parece que ObjetoPersonalidad, el nombre, tiene muchos comportamientos. • La variable personalidades de la clase EjemploPersonalidad es un ejemplo de variable polimórfica. • Una variable polimórfica es aquella que puede contener muchos tipos distintos.

  19. TIPOS DE POLIMORFISMO • Existen tres modalidades de polimorfismo: • Polimorfismo de inclusión. • Redefinición. • Sobrecarga.

  20. POLIMORFISMO DE INCLUSIÓN • Permite que un objeto exprese muchos comportamientos distintos en tiempo de ejecución. Es decir, permite dar un tratamiento genérico a los objetos relacionados. • A continuación, vamos a ver un caso de ejemplo donde se utiliza el polimorfismo de inclusión.

  21. POLIMORFISMO DE INCLUSIÓN: EJEMPLO • Consideremos los siguientes métodos: publicvoidhaceHablar ( ObjetoPesimistaobj ) { System.out.println( obj.hablar() ); } publicvoidhaceHablar ( ObjetoOptimistaobj ) { System.out.println( obj.hablar() ); } publicvoidhaceHablar ( ObjetoIntrovertidoobj ) { System.out.println( obj.hablar() ); } publicvoidhaceHablar ( ObjetoExtrovertidoobj ) { System.out.println( obj.hablar() ); }

  22. POLIMORFISMO DE INCLUSIÓN: EJEMPLO • ObjetoPesimista, ObjetoOptimista, ObjetoIntrovertido y ObjetoExtrovertido están relacionados porque todos derivan de ObjetoPersonalidad. • La sustituibilidad y el polimorfismo de inclusión ofrecen la posibilidad de escribir un método para manejar todos los tipos derivados de ObjetoPersonalidad: public void haceHablar ( ObjetoPersonalidad obj ) { System.out.println( obj.hablar() ); } • La sustituibilidad permite pasar cualquier ObjetoPersonalidad al método haceHablar(). • El polimorfismo asegura que sea llamado el método apropiado de la instancia. El polimorfismo llama al método con base en el tipo verdadero de la instancia (ObjetoPesimista, ObjetoOptimista, ObjetoIntrovertido, ObjetoExtrovertido), y no con base en el tipo aparente de la instancia (ObjetoPersonalidad).

  23. POLIMORFISMO DE INCLUSIÓN: EJEMPLO • El polimorfismo de inclusión es útil porque reduce la cantidad de código por escribir. En lugar de tener que escribir un método para cada tipo concreto de ObjetoPersonalidad, tan sólo es necesario escribir un método que maneje todos los tipos. • El polimorfismo de inclusión y la sustituibilidad permiten que haceHablar() trabaje con cualquier objeto que cumpla la condición “ES UN” ObjetoPersonalidad. • El polimorfismo de inclusión facilita la incorporación de nuevos subtipos a un programa porque no es necesario agregar un método específico para ese nuevo tipo. Simplemente se puede reutilizar haceHablar(). • El polimorfismo de inclusión también es interesante porque permite que las instancias de ObjetoPersonalidad den la impresión de contar con muchos comportamientos distintos. El mensaje mostrado por haceHablar() varía según la información que se pase al método.

  24. REDEFINICIÓN • La redefinición es un tipo importante de polimorfismo. • Permite redefinir un método y confiar en que el polimorfismo se encargará de que siempre se ejecute el método correcto. • A continuación, vamos a ver un caso de ejemplo donde se utiliza la redefinición y el polimorfismo.

  25. REDEFINICIÓN: EJEMPLO • Analicemos las definiciones de las siguientes clases: publicclassObjetoEnojado { // devuelve el estado de ánimo protectedStringgetEstadoAnimo() { return "enojado"; } // pregunta al objeto cómo se siente publicvoidpreguntaEstadoAnimo() { System.out.println(“¡Hoy me siento " + getEstadoAnimo() + "!"); } }

  26. REDEFINICIÓN: EJEMPLO • Analicemos las definiciones de las siguientes clases: publicclassObjetoFelizextendsObjetoEnojado { // redefine el estado de ánimo de la clase protectedStringgetEstadoAnimo() { return "feliz"; } // especialización publicvoidreir() { System.out.println("jajajejejijijojojuju"); } }

  27. REDEFINICIÓN: EJEMPLO • ObjetoFeliz redefine el método getEstadoAnimo() de ObjetoEnojado. Es interesante darnos cuenta que, internamente, la definición de preguntaEstadoAnimo() de ObjetoEnojado hace una llamada a getEstadoAnimo(). • ObjetoFelizno redefine el método preguntaEstadoAnimo(). En vez de ello, lo hereda como método recursivo de ObjetoEnojado. Al llamar a preguntaEstadoAnimo() en un ObjetoFeliz, el polimorfismo de la instancia se asegura de llamar a la versión redefinida de getEstadoAnimo() de ObjetoFeliz. • En definitiva, el polimorfismo se encarga de los detalles sobre qué método llamar. Esto nos libera de tener que redefinir preguntaEstadoAnimo() para llamar a la versión correcta de getEstadoAnimo().

  28. SOBRECARGA • La sobrecarga o polimorfismo ad-hoc permite utilizar el mismo nombre de método para distintos métodos. • Cada método difiere sólo en la cantidad y tipo de sus parámetros. • A continuación, vamos a ver un caso de ejemplo donde se utiliza la sobrecarga.

  29. Sobrecarga: Ejemplo • Consideremos los siguientes métodos de java.lang.Math: publicstaticintmax ( int a, int b ); publicstaticlongmax ( long a, long b ); publicstaticfloatmax ( float a, float b ); publicstaticdoublemax ( double a, double b ); • Todos los métodos max son ejemplos de sobrecarga. Se puede observar que los métodos max sólo difieren en el tipo de parámetros. • La sobrecarga es útil cuando un método no está definido por sus argumentos. Es decir, un método es un concepto independiente de sus argumentos. • Por ejemplo, el método max es un concepto genérico que toma dos parámetros e indica cuál es mayor. Esta definición no cambia, ya sea que se comparen números enteros, de punto flotante o de doble precisión. • La operación + es otro ejemplo de método sobrecargado. El concepto + es independiente de sus argumentos, pues podemos agregar todo tipo de elementos.

  30. Sobrecarga: Ejemplo • Si la sobrecarga no fuera posible, tendríamos que hacer lo siguiente: publicstaticintmax_int ( int a, int b ); publicstaticlongmax_long ( long a, long b ); publicstaticfloatmax_float ( float a, float b ); publicstaticdoublemax_double ( double a, double b ); • Sin la sobrecarga, sería necesario dar un nombre único a cada método. Los métodos max no serían independientes de sus parámetros. Es decir, Max dejaría de ser un concepto abstracto; y tendríamos que definir el método de acuerdo con sus argumentos. • Dar diferentes nombres a cada método no es polimórfico. Cuando todos los métodos comparten el mismo nombre, se obtiene comportamiento polimórfico pues distintos métodos son llamados de acuerdo con los tipos de parámetros que se pasan.

  31. Sobrecarga: Ejemplo • El polimorfismo se encarga de llamar al método apropiado. • La forma en que el polimorfismo enruta la llamada al método depende del lenguaje de programación. • Algunos lenguajes resuelven la llamada al método durante la compilación, mientras que otros la enlazan dinámicamente en tiempo de ejecución.

More Related