Вы находитесь на странице: 1из 37

Polimorfismo

El concepto de polimorfismo es central en la programacin orientada a objetos.

Polimorfismo significa muchas formas y en ciencias de la computacin en particular se refiere a la capacidad de asociar diferentes definiciones a un mismo nombre, de modo que el contexto determine cul corresponde usar.
En el contexto de la programacin orientada a objetos el polimorfismo est relacionado con variables, asignaciones y mtodos.
Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Dada la siguiente jerarqua de clases: Persona

Cliente

Empleado

Ejecutivo
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Persona <<atributos de instancia>> nombre : String calleNro : String telefono : String email : String <<Constructores>> <<Comandos>> establecerCalleNro (d: String) <<Consultas>> obtenerCalleNro () : String toString () : String
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Empleado
Retorna verdadero si el empleado que recibe el mensaje es ms antiguo que el argumento

<<atributos de instancia>> basico : real Al salario bsico se le suma cantHijos : entero $100 si tiene entre 10 y 15 aos fechaIngreso : Fecha de antigedad y $200 si tiene <<Constructores>> ms de 15 aos de antigedad. <<Comandos>> A este valor se le suma $mh por establecerBasico(b:real) cada hijo. aumentarBasico (a:real) <<Consultas>> toString () : String Una semana cuando cumple 1 ao, 2 semanas cuando cumple masAntiguo(Empleado e) : booleano 5 aos y 3 semanas cuando su sueldoNeto (mh: real) : real antigedad es mayor a 10 aos. diasVacaciones () : entero

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Ejecutivo <<atributos de instancia>> productividad:real presupuesto : real viaticos : real <<Constructores>> <<Comandos>> establecerPresupuesto (p:real ) aumentarPresupuesto (a:real ) <<Consultas>> obtenerPresupuesto () : real sueldoNeto (h:real) : real diasVacaciones () : entero

A partir del sueldo de cualquier empleado se suma la productividad

20 das

Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Una variable polimrfica puede quedar asociada a objetos de diferentes clases.
Persona unaPersona; unaPersona = new Persona(); unaPersona Persona unaPersona = new Empleado(); unaPersona Empleado
Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Dado que una variable puede estar asociada a objetos de diferentes tipos, distinguiremos entre:

El tipo esttico de una variable, es el tipo que aparece en la declaracin


El tipo dinmico de una variable se determina en ejecucin y corresponde a la clase a la que corresponde el objeto referenciado El tipo esttico de una entidad determina el conjunto de tipos dinmicos a los que puede quedar asociada.
Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Una asignacin polimrfica liga un objeto de una clase a una variable declarada de otra clase
Persona unaPersona; Empleado unEmpleado = new Empleado(); Ejecutivo unEjecutivo = new Ejecutivo(); Son vlidas las siguientes asignaciones polimrficas: unaPersona = unEmpleado; unaPersona = unEjecutivo; unEmpleado = unEjecutivo; Y tambin: unaPersona = new Empleado(); unaPersona = new Ejecutivo();
Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Persona unaPersona; Empleado unEmpleado = new Empleado(); unaPersona = unEmpleado;

unaPersona
unaEmpleado Empleado La variable unaPersona puede quedar ligada a objetos de clase Persona, Cliente, Empleado o Ejecutivo. La variable unEmpleado puede quedar ligada a objetos de clase Empleado o Ejecutivo.
Introduccin a la Programacin Orientada a Objetos

Polimorfismo
Empleado unEmpleado = new Empleado(); Empleado otroEmpleado = new Ejecutivo ();

Ejecutivo unEjecutivo = new Ejecutivo ();

unEmpleado.aumentarBasico(100); otroEmpleado.aumentarBasico(100); unEjecutivo.aumentarBasico(100);

Introduccin a la Programacin Orientada a Objetos

Polimorfismo
El pasaje de parmetros tambin puede ser polimrfico:
Empleado unEmpleado = new Empleado(); Ejecutivo unEjecutivo = new Ejecutivo();

El mtodo definido en la clase Empleado como:


public boolean masAntiguo(Empleado e) { }

Puede usarse con un argumento de clase Ejecutivo:


unEmpleado.masAntiguo (unEjecutivo);
Introduccin a la Programacin Orientada a Objetos

Ligadura dinmica de cdigo


La ligadura dinmica de cdigo es la vinculacin en ejecucin de un mensaje con un mtodo. Polimorfismo, overriding (redefinicin de mtodos) y ligadura dinmica de cdigo son conceptos fuertemente ligados. La posibilidad de que una variable pueda referenciar a objetos de diferentes clases y de que existan varias definiciones para una misma signatura, brinda flexibilidad al lenguaje siempre que adems exista ligadura dinmica de cdigo.

Introduccin a la Programacin Orientada a Objetos

Overiding
Empleado unEmpleado = new Empleado(); Empleado otroEmpleado = new Ejecutivo(); Ejecutivo unEjecutivo = new Ejecutivo(); unEmpleado.sueldoNeto(100); Se liga al mtodo definido en Empleado otroEmpleado.sueldoNeto(100); Se liga al mtodo definido en Ejecutivo unEjecutivo.sueldoNeto(100); Se liga al mtodo definido en Ejecutivo
Introduccin a la Programacin Orientada a Objetos

Polimorfismo , Overiding y Ligadura dinmica


El objeto referenciado por unEmpleado slo podr recibir los mensajes que corresponden al comportamiento de la clase Empleado. Sin embargo, si un mtodo est redefinido en la clase Ejecutivo, la ligadura se establece con el mtodo provisto por Ejecutivo.

Introduccin a la Programacin Orientada a Objetos

Polimorfismo , Overiding y Ligadura dinmica


Empleado unEmpleado = new Empleado(); Empleado otroEmpleado = new Ejecutivo();

unEmpleado.diasVacaciones(); Se liga al mtodo definido en Empleado

otroEmpleado.diasVacaciones(); Se liga al mtodo definido en Ejecutivo

Introduccin a la Programacin Orientada a Objetos

Polimorfismo , Overiding y Ligadura dinmica


Empleado unEmpleado = new Empleado(); Empleado otroEmpleado = new Ejecutivo();

System.out.println(unEmpleado.toString()); Se liga al mtodo definido en Empleado

System.out.println(otroEmpleado.toString()); Se liga al mtodo definido en Ejecutivo

Introduccin a la Programacin Orientada a Objetos

Chequeo de Tipos
El polimorfismo es un mecanismo que favorece la reusabilidad pero debe restringirse para brindar confiabilidad Los chequeos de tipos en compilacin garantizan que no van a producirse errores de tipo en ejecucin El chequeo de tipos establece restricciones sobre: las asignaciones polimrficas

los mensajes que un objeto puede recibir


Introduccin a la Programacin Orientada a Objetos

Polimorfismo y chequeo de tipos


Una variable polimrfica puede referenciar a objetos de su clase o de alguna de las clases derivadas.
Persona unaPersona; Empleado unEmpleado = new Empleado();

Ejecutivo unEjecutivo = new Ejecutivo();

El compilador reporta error en las siguientes asignaciones:


unEmpleado = unaPersona; unEjecutivo= unaPersona; unEjecutivo= unEmpleado;
Introduccin a la Programacin Orientada a Objetos

Polimorfismo y chequeo de tipos


Una variable polimrfica determina los mensajes que un objeto puede recibir, aunque el objeto determina la implementacin especfica del comportamiento que se ejecuta en respuesta a los mensajes.
Empleado unEmpleado ; Ejecutivo unEjecutivo = new Ejecutivo (); unEmpleado = unEjecutivo;

Son vlidos los mensajes:


unEmpleado.establecerBasico (1500); unEjecutivo.establecerPresupuesto(200);
Introduccin a la Programacin Orientada a Objetos

Polimorfismo y chequeo de tipos


Empleado unEmpleado ; Empleado nuevo ;

Ejecutivo unEjecutivo = new Ejecutivo ();


unEmpleado = unEjecutivo; nuevo = new Ejecutivo ();

El compilador reporta error en los siguientes mensajes:


unEmpleado.establecerPresupuesto(100);

nuevo.aumentarPresupuesto(100);
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


La empresa mantiene la informacin referida a sus empleados en una coleccin. La coleccin brinda servicios para insertar, eliminar y buscar elementos y adems para calcular: - Total de Salarios bsicos

- Contar los empleados que tienen ms de d das de vacaciones.


- Total de Salarios netos

-Total de Salarios bsicos de los ejecutivos


-Total de los presupuestos asignados a los Ejecutivos
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados

Persona

Cliente

Empleado

PlantaEmpleados

Ejecutivo

PlantaEmpleados es una coleccin


Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Empleado
<<atributos de instancia>> <<consultas>>

PlantaEmpleados

Empleado [] T cantEmpleados : entero


<< comandos>> insertar(a : Empleado) <<consultas>> existeElemento(a : Empleado) boolean
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Empleado
<<atributos de instancia>> <<consultas>>

PlantaEmpleados

Empleado [] T cantEmpleados : entero


Cuenta la cantidad de <<consultas>> empleados que tienen ms de basicoTotal() : real contarMasVacaciones(d: entero) : enterod das de vacaciones basicoEjecutivos() : real presupuestoEjecutivos() : real netoTotal (h:real) :real
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


import java.util.*; class PlantaEmpleados{

private Empleado[] T; private int cantEmpleados;


}

El arreglo mantiene referencias a objetos de clase Empleado o de alguna de sus subclases.


Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


T Empleado

Ejecutivo

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


El arreglo est constituido por una coleccin de variables polimrficas. Cuando una componente del arreglo reciba un mensaje su comportamiento depender de la clase a la que pertenezca esta componente.

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public float basicoTotal (){ float bt = 0; for (int i = 0; i <cantElementos();i++) {

bt = bt+T[i].obtenerBasico();
} return bt; }

El mtodo obtenerBasico() es el mismo para todos los empleados, est implementado en la clase Empleado.
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public int contarMasVacaciones (int d){

int c = 0; for (int i = 0; i <cantElementos();i++) { if (T[i].diasVacaciones() >= d) c++; } return c; } La ligadura con el mtodo diasVacaciones() se establece de acuerdo a la clase del objeto referenciado por T[i]
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double netoTotal(float h){ float c = 0; Empleado emp; for (int i = 0; i <cantElementos();i++) { emp = T[i]; c = c+emp.sueldoNeto(h); } return c; }

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double basicoEjecutivos (){ float be = 0; Empleado emp; for (int i = 0; i <cantElementos();i++) {

if (T[i] instanceof Ejecutivo) {


emp = T[i]; be = be+emp.obtenerBasico(); } } return be; } Si el programador no chequea la clase, el resultado no va a ser correcto y el error va a pasar inadvertido, se produce un error de aplicacin. Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double presupuestoEjecutivos (){ float c = 0; for (int i = 0; i <cantElementos();i++) {

if (T[i] instanceof Ejecutivo) {


c = c+T[i].obtenerPresupuesto(); }

} return c; }

El mensaje no es vlido Error en compilacin

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double presupuestoEjecutivos (){ float c = 0; Ejecutivo eje; for (int i = 0; i <cantElementos();i++) {

if (T[i] instanceof Ejecutivo) {


eje = T[i]; c = c+eje.obtenerPresupuesto();

}
} return c; }
La asignacin no es vlida Error en compilacin

Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double presupuestoEjecutivos (){ float c = 0; Ejecutivo eje; for (int i = 0; i <cantElementos();i++) {

if (T[i] instanceof Ejecutivo) {


eje = (Ejecutivo) T[i]; c = c+eje.obtenerPresupuesto(); } } return c; } El casting relaja el control del compilador, el programador asegura que no va a haber errores.
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


public double presupuestoEjecutivos (){ float c = 0; Ejecutivo eje; for (int i = 0; i <cantElementos();i++) { eje = (Ejecutivo) T[i]; c = c+eje.obtenerPresupuesto(); } return c; T }
Error en ejecucin EXCEPCIN Empleado
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


Una excepcin indica que se ha producido un evento inesperado en ejecucin, con frecuencia un error. Algunas excepciones provocan que el programa termine anormalmente. Cuando Java intenta hacer un cast sobre un objeto y su clase no corresponde con el operador se produce una excepcin y se genera un objeto de clase ClassCastException.

Los errores ms peligrosos son los que saltean los controles y pasan desapercibidos.
Introduccin a la Programacin Orientada a Objetos

Caso de Estudio: Nmina de Empleados


El uso de instanceof est desaconsejado por la Programacin Orientada a Objetos. Si el diseo est bien elaborado no debera ser necesario. Sin embargo, al cambiar los requerimientos las clases pueden modificarse y las nuevas funcionalidades se implementan con instanceof.

Introduccin a la Programacin Orientada a Objetos

Вам также может понравиться