La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Unidad 6 Polimorfismo.

Presentaciones similares


Presentación del tema: "Unidad 6 Polimorfismo."— Transcripción de la presentación:

1 Unidad 6 Polimorfismo

2 ¿Qué es el polimorfismo?
El polimorfismo significa “muchas formas”. 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.

3 ObjetoPersonalidad.java public class ObjetoPersonalidad {
public String hablar() { return "Soy un objeto."; }

4 ObjetoPesimista.java ObjetoOptimista.java
public class ObjetoPesimista extends ObjetoPersonalidad { public String hablar() { return "El vaso está medio vac¡o."; } public class ObjetoOptimista extends ObjetoPersonalidad { return "El vaso está medio lleno.";

5 ObjetoIntrovertido.java ObjetoExtrovertido.java
public public class ObjetoIntrovertido extends ObjetoPersonalidad { public String hablar() { return “Hola."; } public class ObjetoExtrovertido extends ObjetoPersonalidad { return "Hola, bla, bla, bla, sabías que bla, bla, bla.";

6 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.

7 EjemploPersonalidad.java public class EjemploPersonalidad {
public static void main( 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;

8 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()); }

9 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. Process exited with exit code 0.

10 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().

11 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.

12 Tipos de Polimorfismo Existen tres modalidades de polimorfismo:
Polimorfismo de inclusión. Redefinición. Sobrecarga.

13 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.

14 Polimorfismo de inclusión: Ejemplo
Consideremos los siguientes métodos: public void haceHablar ( ObjetoPesimista obj ) { System.out.println( obj.hablar() ); } public void haceHablar ( ObjetoOptimista obj ) { public void haceHablar ( ObjetoIntrovertido obj ) { public void haceHablar ( ObjetoExtrovertido obj ) {

15 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).

16 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.

17 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.

18 Redefinición: Ejemplo
Analicemos las definiciones de las siguientes clases: public class ObjetoEnojado { // devuelve el estado de ánimo protected String getEstadoAnimo() { return "enojado"; } // pregunta al objeto cómo se siente public void preguntaEstadoAnimo() { System.out.println(“¡Hoy me siento " + getEstadoAnimo() + "!");

19 Redefinición: Ejemplo
Analicemos las definiciones de las siguientes clases: public class ObjetoFeliz extends ObjetoEnojado { // redefine el estado de ánimo de la clase protected String getEstadoAnimo() { return "feliz"; } // especialización public void reir() { System.out.println("jaja jeje jiji jojo juju");

20 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(). ObjetoFeliz no 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().

21 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.

22 Sobrecarga: Ejemplo Consideremos los siguientes métodos de java.lang.Math: public static int max ( int a, int b ); public static long max ( long a, long b ); public static float max ( float a, float b ); public static double max ( 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.

23 Sobrecarga: Ejemplo Si la sobrecarga no fuera posible, tendríamos que hacer lo siguiente: public static int max_int ( int a, int b ); public static long max_long ( long a, long b ); public static float max_float ( float a, float b ); public static double max_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.

24 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.


Descargar ppt "Unidad 6 Polimorfismo."

Presentaciones similares


Anuncios Google