140 likes | 342 Views
CURSO Programación Orientada a Objetos Parte 3 POLIMORFISMO. Ignacio Zahonero Martínez, Luis Joyanes Aguilar. POLIMORFISMO.
E N D
CURSO Programación Orientada a ObjetosParte 3POLIMORFISMO Ignacio Zahonero Martínez, Luis Joyanes Aguilar
POLIMORFISMO • El polimorfismo permite referirse a objetos de diferentes clases por medio del mismo elemento y realizar la misma operación de formas diferentes, de acuerdo al objeto a que se hace referencia en cada momento. • Otra forma de definir el polimorfismo: el envío del mismo mensaje desencadena acciones diferentes según el objeto que lo recibe. Un ejemplo típico es la operación arrancar cuando se aplica a diferentes tipos de motores; en cada caso la operación de arrancar se realiza de forma diferente. • La construcción del lenguaje que hace posible el polimorfismo es la ligadura dinámica (conocida también por ligadura tardía o postergada) entre llamadas a métodos y los cuerpos reales de dichos métodos. • La ligadura dinámica supone que el código a ejecutar en respuesta a un mensaje no se determinará hasta el momento de ejecución. • En C++ la ligadura dinámica se soporta con las funciones virtuales y la herencia. • En Java la ligadura dinámica se basa en la capacidad de redefinir (reemplazar) métodos en la subclase, en el contexto de herencia.
REDEFINICIÓN DE MÉTODOS(I) • Suponer las clases Nombre y NomFamiliar. La segunda es una extensión de la primera, también se puede decir que NomFamiliar deriva de Nombre. Nombre - nom - apell + getNom() + getIniciales() + getSurnFirs() • La clase NomFamiliar hereda y redefine los métodos getIniciales() y getNom() • El constructor de NomFamil primero inicializa Nombre y a continuación apodo: • super(elNom, eapell); • this.apodo = apodo • La redefinición de getIniciales() proporciona (añade) la inicial del apodo. • La redefinición de getNom() añade al nom y apell el apodo. NomFamiliar - apodo + getIniciales() + getNom()
REDEFINICIÓN(II) • Se van a crear dos objetos de las clases Nombre y NomFamiliar: • Nombre uno = new Nombre("Paloma", "Zaho"); • NomFamiliar dos = new NomFamiliar("Paloma", "Zaho", "Palo"); • Ahora se invocan los métodos: • String q = uno.getIniciales(); // método de Nombre y referenciado por var del tipo Nombre • String w = dos.getIniciales(); // método de NomFamiliar y referenciado por var de ese tipo • String f = dos.getSurnFirs(); // no es método de NomFamiliar pero es heredado de Nombre • Si ahora se crea este objeto: • Nombre uno = new NomFamiliar("Maria", "Zaho", "Ofilia"); • válido porque se puede utilizar un objeto subclase en cualquier lugar que esté permitido un objeto del tipo superclase. Al invocar: • uno.getIniciales(); • dará lugar a que se ejecute el método definido enNomFamiliar, aunque uno sea de tipo Nombre,porque uno referencia a un objeto derivado y el método llamado tiene la misma signatura queel de la superclase,Nombre.
POLIMORFISMO • Conclusión: • En una jerarquía de herencia, cuando se llama a métodos desde una referencia a la superclase que han sido redefinidos en las clases derivadas, lo que se tiene en cuenta es el tipo del objeto actual referenciado. De tal forma que se ejecutará el método redefinido en el tipo actual. • En definitiva, al llamar a un mismo método sobre una misma variable referencia se producirá la llamada a métodos distintos dependiendo del objeto referenciado. • En una jerarquía de Vehículos que deben pagar el peaje de una autopista: • Vehiculo cual; • cual = new Turismo(); • cual.calculoTasa(); • cual = new CicloMotor(); • cual.calculoTasa(); • cual = new Camion(); • cual.calculoTasa(); • La llamada es sobre una variable de tipo Vehiculo, el método ejecutado depende del objeto actual referenciado. Ante un mismo mensaje se responde de formas diferente POLIMORFISMO.
EJEMPLO DE POLIMORFISMO(1) • Consideremos la clase Instrumento como la clase base de la que se derivan otras clases, tales como Piano, Guitarra, GitarraEléctrica y Bombo. Cada instrumento musical debe tener la posibilidad de tocar una pieza y afinar. En este caso la clase Instrumento declara los siguientes métodos: • class Instrumento • { • public void tocar(String cd) • { • System.out.println("instrumento interpreta " + cd); • } • // public abstract bool afinar(); // NO SE DESARROLLA • } • Cada clase derivada debe definir sus propias versiones concretas de los métodos que han sido declarados en la clase base. class Piano extends Instrumento { public void tocar(String cd) { System.out.println( "Piano interpreta "+ cd); } } class Guitarra extends Instrumento { public void tocar(String cd) { System.out.println( "Guitarra " + cd); } }
EJEMPLO DE POLIMORFISMO(2) • class Bombo extends Instrumento • { • public void tocar(string cd) • { • System.out.println( • "Bombo toca " + cd); }; • } • Por ejemplo, las siguientes llamadas: • Bombo b1; b1.tocar("Panocha"); • Guitarra g1; g1.tocar("Aranjuez"); • Instrumento it; it.tocar("Piano"); • son llamadas directas, y se enlazan a un código específico en la compilación ( ligadura estática). class GuitarraElectrica extends Guitarra { public void tocar(String cd) { System.out.println( "Guitarra electrica toca " + cd); } }
EJEMPLO DE POLIMORFISMO(3) • Ahora se va a llamar al método redefinido tocar() a través de una referencia a la superclase Instrumento. • Instrumento pin[]= new Instrumento[5]; for (int i = 0; i < pin.length; i++) • pin[0] = new GuitaraElectica(); pin[i].tocar("Rumba"); • pin[1] = new Instrumento(); • pin[2] = new Guitara(); • pin[3] = new Bombo(); • pin[4] = new Piano(); • En la llamada pin[i].tocar("Rumba") se produce ligadura dinámica; el compilador no puede determinar cuál es la implementación específica del método tocar() que se ha de ejecutar. La salida que genera la ejecución: • Guitarra electrica toca Rumba • instrumento interpreta Rumba • Guitarra interpreta Rumba • Bombo toca Rumba • Piano interpreta Rumba • El polimorfismo es una característica de los lenguajes O.O que consiste en que el método exacto que se llama queda determinado en el momento de ejecución por la clase del objeto receptor.
EJERCICIOS (1) Una empresa fabrica tres tipos distintos de aleaciones metálicas. La composición porcentual de cada aleación es el siguiente: El precio por tonelada de cada aleación viene dado por el precio de los materiales más el coste del proceso de fabricación: El precio por Tm de los materiales es, Hierro: 3211, Cobre: 2705, Zinc: 3050. Por otra parte el coste de los procesos de fabricación depende del peso de la aleación y es: coste de aleación A (p) = 200*p2 + 125*p coste de aleación B (p) = Ln (p) * p + 25*p coste de aleación C (p) = 2025*p Se pide: a) Diseñar una jerarquía de clases. b) Declarar y definir cada clase de la jerarquía. c) Escribir un programa que permita introducir un número n de pedidos y los guarde cada pedido en un array. Una vez realizados los pedidos se ha de recorrer el array para escribir en pantalla la característica de cada pedido, calcular su presupuesto y el total.
EJERCICIOS(2) Supongamos un sucursal bancaria que maneja diferentes tipos de cuentas. Toda cuenta contiene 3 atributos comunes: año de apertura, nombre del propietario y saldo. Existen cuatro tipos de cuentas: Vivienda, Valores, Corriente y Ahorro. Cada una de las cuales tiene atributos adicionales: Vivienda: precio de la vivienda y tipo. Valores: nombre del valor y dinero invertido (por simplicidad, suponer un único valor) Corriente: fecha del último movimiento(dia, mes y año) y cantidad. Ahorro: Interes de la cuenta (tanto por cien). a) Diseñar una jerarquía de clases. b) Encontrar operaciones que puedan definirse polimórficamente. c) Declarar y definir cada clase de la jerarquía. d) Escribir un programa que guarde una lista de cuentas bancarias con datos leídos del teclado. A continuación realizar operaciones con las cuentas, como, por ejemplo, ingresar dinero, dar intereses... . Implementar una jerarquía empleado de cualquier tipo de empresa que le resulte conocida. La jerarquía debe tener al menos 3 niveles, con herencia de miembros. La operaciones deben poder calcular salarios, dar de alta, generar primas. Estas operaciones se realizarán de acuerdo al tipo de empleado. Escribir un programa que cree objetos de los diferentes tipos de empleados y realice operaciones polimórficas. Escribir una clase Figura que represente figuras geométricas talec como triángulo, triángulo equilatero, cuadrado, rectángulo y cículo. Debe proporcionar métodos que permitan dibujar, calcular el area, calcular el pérímetro y destruir tales objetos. Escribir un programa que cree objetos de las figuras concretas, los guarde en un array o lista y realice operaciones polimórficas (cáculo del área ... ).