Unidad 6 Polimorfismo.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Curso de Java Capitulo 7: Continuación Poo Profesor:
Herencia en C#.
Fundamentos de la programación orientada a objetos
Lenguaje de programación Java
Clases Extendidas La clase extendida hereda los campos y métodos de la clase de la cual extiende. La clase original se conoce como superclase y la clase.
Lección 2 Encapsulamiento
Conceptos más avanzados de Programación Orientada a Objetos Programación 2005 Licenciatura de Lingüística y Nuevas Tecnologías.
Inner classes CAPITULO 8.
Genéricos en Java Jaime Ramírez, Ángel Lucas González
Herencia y Polimorfismo
UNIVERSIDAD LATINA (UNILA)
Aplicación del paradigma orientado a objetos
Diseño y programación de
PROGRAMACION ORIENTADA A OBJETOS
HERENCIA.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga Dada la siguiente jerarquía de clases: Alfa Delta Beta.
Herencia e Interfaces.
Medio de tele-comunicación
Herencia y Polimorfismo en JAVA
Polimorfismo Lenguajes de Programación II Corporación Universitaria del Caribe CECAR.
Lic. Rosemary Torrico Bascopé
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Variables polimórficas (plantillas): definición, uso y aplicación
UNIDAD 2 CLASES Y OBJETOS. CLASE Elementos cabecera y cuerpo de la clase. Cabecera: aporta información fundamental sobre la clase en sí y constituye de.
Clase Teórica No. 4 Programación IV
Capitulo # 4 herencia PROGRAMACION III UNIVERSIDAD
ESTRUCTURA DE DATOS EN JAVA
Herramientas de polimorfismo y herencia en C++
Metodología de Programación Ayudantía 5 lelagos.ublog.cl 2009.
Informatica II1 Clases Extendidas La clase extendida hereda los campos y métodos de la clase que ha sido extendida. La clase original se conoce como superclase.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
PROGRAMACION ORIENTADA A OBJETOS POR OVER YESID BARRERA FERNANDEZ.
Unidad 2.1: INTRODUCCIÓN A LA ORIENTACIÓN A OBJETOS.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
CONCEPTOS.
INSTITUTO TECNOLOGICO DE TEHUACAN Ingeniería en sistemas computacionales Curso de apoyo a la titulación CLASES DE JAVA Diciembre de 2008.
Encapsulamiento Miguel Ángel Rojas Aguilar Esthela Carmina Carranza Cabrera.
Clases “ Es una Abstracción de un elemento del mundo real ”
GENERICIDAD Es una propiedad que permite definir una clase o función sin especificar el tipo de datos de uno o mas de sus parámetros (Módulos Parametrizados).
1 La sobrecarga de funciones y operadores le da al programador la oportunidad de asignar nuevos significados a las funciones y a los operadores.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
 En Java, como en otros lenguajes de programación orientados a objetos, las clases pueden derivar desde otras clases. La clase derivada (la clase que.
Tema – 5 Construcciones condicionales Introducción En un programa es usual ejecutar unas instrucciones u otras en función de unas condiciones especificadas.
Inecuaciones lineales o inecuaciones de primer grado
Diagrama de clases Silvia Herzovich Rodrigo Aronas Matias Silversteyn.
Clase II Estructuras dinámicas (TAD) Listas Enlazadas. ¿A que llamamos estructuras dinámicas? ¿Por qué son necesarias? Ventajas y Desventajas que tendremos.
Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones Fundamentos de Programación Departamento.
1 Clase 4: primeros programas (2ª parte) iic1102 – introducción a la programación.
This y static. This Normalmente, dentro del cuerpo de un método de un objeto se puede referir directamente a las variables miembros del objeto. Sin embargo,
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
Una base de datos, a fin de ordenar la información de manera lógica, posee un orden que debe ser cumplido para acceder a la información de manera coherente.
RELACIONES ENTRE CLASES M.C. YOLANDA MOYAO MARTINEZ.
Excepciones Diseño y manejo de excepciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 5 Versión
Diseño de tipos Igualdad, representación, código, copia y relación de orden Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos.
Herencia y Clases Abstractas Reutilización de código y código genérico ELO329: Diseño y Programación Orientados a Objetos.
Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.
Tratamientos secuenciales I Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 8 Versión
METODOS DE PROGRAMACION I Ing. Vania Flores Pinto.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Lenguaje Java  Todo programa Java es compilado y después interpretado  Independencia de la plataforma Programa Java fichero.java Byte code fichero.class.
Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3.
:: Prof. Yeniffer Peña Programación I Programación Orientada a Objetos Presentación.
1 Clase 5: primeros programas (3ª parte) iic1102 – introducción a la programación.
Transcripción de la presentación:

Unidad 6 Polimorfismo

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

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

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.";

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.";

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.

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;

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

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.

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

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.

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

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.

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 ) {

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

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.

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.

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() + "!");

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");

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

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.

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.

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.

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.