Download polimorfismo.

Document related concepts
no text concepts found
Transcript
CURSO
Programación Orientada a Objetos
Parte 3
POLIMORFISMO
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.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
2
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
 La clase NomFamiliar hereda y redefine los métodos
getIniciales() y getNom()
- apell
+ getNom()
+ getIniciales()
+ getSurnFirs()
 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.
NomFamiliar
- apodo
 La redefinición de getNom() añade al nom y apell el
apodo.
+ getIniciales()
+ getNom()
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
3
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();
String w = dos.getIniciales();
String f = dos.getSurnFirs();

// método de Nombre y referenciado por var del tipo Nombre
// método de NomFamiliar y referenciado por var de ese tipo
// 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 en NomFamiliar, aunque uno sea de tipo Nombre, porque uno
referencia a un objeto derivado y el método llamado tiene la misma signatura que el de la superclase, Nombre.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
4
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.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
5
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);
}
}
Curso de Programación Orientada a Objetos en Java
class Guitarra extends Instrumento
{
public void tocar(String cd)
{
System.out.println(
"Guitarra " + cd);
}
}
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
6
EJEMPLO DE POLIMORFISMO(2)
class Bombo extends Instrumento
{
public void tocar(string cd)
{
System.out.println(
"Bombo toca " + cd); };
}
class GuitarraElectrica extends Guitarra
{
public void tocar(String cd)
{
System.out.println(
"Guitarra electrica toca " + cd);
}
}
 Por ejemplo, las siguientes llamadas:
Bombo b1;
Guitarra g1;
Instrumento it;
b1.tocar("Panocha");
g1.tocar("Aranjuez");
it.tocar("Piano");
son llamadas directas, y se enlazan a un código específico en la compilación ( ligadura estática).
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
7
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];
pin[0] = new GuitaraElectica();
pin[1] = new Instrumento();
pin[2] = new Guitara();
pin[3] = new Bombo();
pin[4] = new Piano();
for (int i = 0; i < pin.length; i++)
pin[i].tocar("Rumba");
 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.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
8
EJERCICIOS (1)
1.
Una empresa fabrica tres tipos distintos de aleaciones metálicas. La composición porcentual de cada aleación es el siguiente:
Hierro
Cobre
Zinc
aleación A
0.7
0.2
0.1
aleación B
0.3
0.7
-
aleación C
0.4
-
0.6
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.
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
9
EJERCICIOS(2)
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... .
3.
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.
4.
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 ... ).
Curso de Programación Orientada a Objetos en Java
Ignacio Zahonero Martínez
Luis Joyanes Aguilar
10