Está en la página 1de 10

Los lenguajes orientados a objetos

• Encapsulamiento
• Abstracción
INTRODUCCIÓN A LA PROGRAMACIÓN 01100
10011
• Herencia Ligadura dinámica
01100
10011
10110 10110
ORIENTADA A OBJETOS 01110 01110
01100
10011 • Polimorfismo 01100
10011
10110 10110
01110 01110
1001 1001
1 11 1 11
Depto. de Ciencias e Ingeniería de la Computación 0 0 0 0
Universidad Nacional del Sur, Bahía Blanca 1 1

Clasificación Clasificación

Empleado Empleado

01100 01100
10011 10011
10110 10110
01110 01110
01100 01100
10011 10011
10110 10110
01110 01110
1001 1001
1 11 1 11
• Consideremos una fábrica en la que trabajan decenas de empelados. 0 0 0 0
1 1
• Cada empleado tiene un número de legajo que lo identifica, una fecha de ingreso y un sueldo básico.
• A partir de la fecha de ingreso se calcula la antigüedad del empleado.
• Algunos de los empleados son operarios y reciben un premio que se computa a partir de las horas Vendedor
trabajadas.
• Los vendedores cobran una comisión que calcula en base a sus ventas acumuladas. Operario

La clase Empleado
Empleado La clase Empleado
<<Atributos>>
legajo: entero Vendedor Operario
sueldoBasico: real <<Atributo de instancia>>
<<Atributo de instancia>>
fechaIngreso: Fecha
legajo: entero legajo: entero
ventaAcumulada: real
sueldoBasico: real sueldoBasico: real
horas: entero
fechaIngreso: Fecha fechaIngreso: Fecha
<<Constructor>> ventaAcumulada: real horas: entero
Empleado(leg: entero, sb: real, fi: Fecha)
<<Comandos>> << Constructores>>
establecerSueldoBasico(sb: real)
<< Constructores>>
01100 Vendedor(leg: entero, sb: real, fi: Fecha, v: real) Operario(leg: entero, sb: real, fi: Fecha) 01100
acumularVentas(m: real) 10011 <<Comandos>> 10011
inicializarVentas () 10110 <<Comandos>> 10110
01110
establecerSueldoBasico(sb: real) establecerSueldoBasico(sb: real) 01110
establecerHoras(h: entero) acumularVentas(m: real)
01100 01100
<<Consultas>> 10011 inicializarVentas () establecerHoras(h: entero) 10011
obtenerLegajo(): entero 10110 <<Consultas>> 10110
<<Consultas>>
obtenerSueldoBasico(): real 01110 obtenerHoras():entero 01110
1001 obtenerVentaAcumulada():real 1001
obtenerFechaIngreso(): Fecha obtenerPremio(p: real): real
obtenerAntiguedad(hoy: Fecha): entero
1 11 obtenerComisionAnual():real 1 11
0 0
obtenerLegajo(): entero obtenerLegajo(): entero 0 0
obtenerVacaciones(hoy: Fecha): entero 1 obtenerSueldoBasico(): real 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real obtenerSueldoBasico(): real
obtenerFechaIngreso(): Fecha obtenerFechaIngreso(): Fecha
obtenerVentaAcumulada():real obtenerAntiguedad(hoy: Fecha): entero
obtenerComisionAnual():real obtenerAntiguedad(hoy: Fecha): entero
obtenerVacaciones(hoy: Fecha): entero obtenerVacaciones(hoy: Fecha): entero
obtenerHoras():entero
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real obtenerSueldoNeto(p: Planilla, hoy: Fecha): real
obtenerPremio(p: real): real

1
La clase Empleado La relación de herencia

Empleado Clase base


<<Atributos>>
legajo: entero
sueldoBasico: real Fecha Empleado Planilla
fechaIngreso: Fecha
<<Constructor>>
Empleado(leg: entero, sb: real, fi: Fecha) 01100 01100
10011 10011
<<Comandos>> 10110 10110
establecerSueldoBasico(sb: real) 01110 01110
<<Consultas>> 01100 01100
10011 10011
obtenerLegajo(): entero 10110 Operario Vendedor 10110
obtenerSueldoBasico(): real 01110 01110
obtenerFechaIngreso(): Fecha 1001 1001

obtenerAntiguedad(hoy: Fecha): entero


1 11
0 0 Clases derivadas 1 11
0 0
obtenerVacaciones(hoy: Fecha): entero 1 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real
Las clases Vendedor y Operario son clases derivadas
de la clase base Empleado

El concepto de herencia La clase Empleado

Empleado
<<Atributos>>
legajo: entero
sueldoBasico: real
La herencia jerárquica es un mecanismo que fechaIngreso: Fecha

permite organizar clases de acuerdo a 01100


<<Constructor>>
01100
Empleado(leg: entero, sb: real, fi: Fecha)
relaciones de generalización-especialización. 10011
10110 <<Comandos>>
10011
10110
01110 establecerSueldoBasico(sb: real) obtenerVacaciones(hoy: Fecha): entero 01110
01100 <<Consultas>> Requiere hoy posterior a fechaIngreso. Retorna la0 1 1 0 0
10011 10011
10110 obtenerLegajo(): entero cantidad de días de vacaciones que le corresponden10110
01110 obtenerSueldoBasico(): real empleado. 01110
1001 obtenerFechaIngreso(): Fecha 7 si antigüedad mayor o igual a 1 y menor o igual1 a0 05.1
1 11 1 11
0 0 obtenerAntiguedad(hoy: Fecha): entero 15 si antigüedad mayor a 5 y menor o igual a 10.0 0
1 obtenerVacaciones(hoy: Fecha): entero 25 si antigüedad es mayor a 10. 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real Si tiene menos de 1 año de antiguedad, no tiene
vacaciones

Reusabilidad
La clase Empleado La especialización de la clase Empleado

Empleado Empleado Vendedor


<<Atributos>> <<Atributos>> <<Atributo de instancia>>
legajo: entero legajo: entero ventaAcumulada: real
sueldoBasico: real sueldoBasico: real << Constructores>>
fechaIngreso: Fecha fechaIngreso: Fecha Vendedor(leg: entero, sb: real, fi: Fecha, v: real)
<<Comandos>>
<<Constructor>> <<Constructor>>
Empleado(leg: entero, sb: real, fi: Fecha) 01100 Empleado(leg: entero, sb: real, fi: Fecha) acumularVentas(m: real) 01100

<<Comandos>>
10011
<<Comandos>> inicializarVentas () 10011
10110 10110
establecerSueldoBasico(sb: real) 01110 establecerSueldoBasico(sb: real) <<Consultas>> 01110
<<Consultas>> 01100 <<Consultas>> obtenerVentaAcumulada():real 01100
10011 obtenerComisionAnual():real 10011
obtenerLegajo(): entero 10110 obtenerLegajo(): entero 10110
obtenerSueldoBasico(): real obtenerSueldoNeto(p: Planilla, hoy: Fecha): real 01110 obtenerSueldoBasico(): real 01110
Requiere p ligada y hoy posterior a fechaIngreso 1 0 0 1 obtenerComisionAnual(): real 1001
obtenerFechaIngreso(): Fecha obtenerFechaIngreso(): Fecha
1 1el
Retorna el sueldo neto del empleado calculado como 1 La comisión es el 5% de la venta acumulada 1 11
obtenerAntiguedad(hoy: Fecha): entero 0 0 obtenerAntiguedad(hoy: Fecha): entero 0 0
obtenerVacaciones(hoy: Fecha): entero sueldo básico incrementado según un porcentaje 1 obtenerVacaciones(hoy: Fecha): entero 1
dependiente de la antigüedad y obtenido de la planila
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real
p.Si tiene 15 años o más el sueldo neto es el doble del
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real Los constructores no se heredan!!!!!
básico
Todo objeto de clase Vendedor es un objeto de clase Empleado.

2
Reusabilidad
La especialización de la clase Empleado La especialización de la clase Empleado

Empleado Operario Operario


<<Atributos>> <<Atributos de instancia>> <<Atributos de instancia>>
legajo: entero horas: entero horas: entero
sueldoBasico: real << Constructores>> Operario << Constructores>>
fechaIngreso: Fecha Operario(leg: entero, sb: real, fi: Fecha) Operario(leg: entero, sb: real, fi: Fecha)
legajo
<<Constructor>> <<Comandos>> <<Comandos>>
Empleado(leg: entero, sb: real, fi: Fecha) establecerHoras(h: entero) 01100 sueldoBasico establecerHoras(h: entero) 01100
10011 10011
<<Comandos>> <<Consultas>> 10110 fechaIngreso <<Consultas>> 10110
establecerSueldoBasico(sb: real) obtenerHoras():entero 01110 obtenerHoras():entero 01110
<<Consultas>> obtenerPremio(p: real): real 01100 horas obtenerPremio(p: real): real 01100
10011 10011
obtenerLegajo(): entero 10110 10110
obtenerSueldoBasico(): real 01110 01110
obtenerFechaIngreso(): Fecha obtenerPremio(p: real): real 1001 obtenerPremio(p: real): real 1001
1 11 1 11
obtenerAntiguedad(hoy: Fecha): entero El premio es el producto de p por las horas 0 0
El premio es el producto de p por las horas 0 0
obtenerVacaciones(hoy: Fecha): entero trabajadas 1 trabajadas 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real
El estado interno de cada instancia de Operario tiene los atributos
Todo objeto de clase Operario es un objeto de clase Empleado. específicos de su clase y los heredados de la clase Empleado.

Los modificadores de acceso Los modificadores de acceso


class Empleado { class Empleado {
protected int legajo; protected int legajo;
protected float sueldoBasico; protected float sueldoBasico;
protected Fecha fechaIngreso; protected Fecha fechaIngreso;
//Constructor //Constructor
public Empleado(int leg, float sb, Fecha fi){
01100 legajo = leg; 01100
10011
10110
sueldoBasico = sb; 10011
10110
01110 fechaIngreso = fi; } 01110
01100 01100
//Comandos 10011 //Comandos 10011
10110 10110
01110 01110
//Consultas 1001 //Consultas 1001
1 11 1 11
0 0 0 0
} 1 } 1

Los atributos protegidos pueden ser accedidos desde las clases Las clases derivadas de la clase base Empleado heredan atributos y
derivadas métodos, no los constructores.

El método obtenerVacaciones en Empleado El método obtenerSueldoNeto en Empleado

class Empleado { class Empleado {


… …
public float obtenerSueldoNeto(Planilla p, Fecha hoy){
public int obtenerVacaciones(Fecha hoy){
/*Requiere p ligada y hoy posterior a fechaIngreso
/*Requiere hoy posterior a fechaIngreso. Retorna la cantidad de días de
vacaciones que le corresponden empleado. Retorna el sueldo neto del empleado calculado como el sueldo
7 si antigüedad mayor o igual a 1 y menor o igual a 5. básico incrementado según un porcentaje dependiente de la
15 si antigüedad mayor a 5 y menor o igual a 10. antigüedad y obtenido de la planila p.
01100 01100
25 si antigüedad es mayor a 10. 10011
Si tiene 15 años o más el sueldo neto es el doble del básico*/ 10011
Si tiene menos de 1 año, no tiene vacaciones */ 10110 int a = obtenerAntiguedad(hoy); 10110
int a = obtenerAntiguedad(hoy); 01110
01100
float sn = 0; 01110
01100
int v = 0; 10011 int porc; 10011

if (a > 10) v = 25; 10110 if (a >= 15) 10110


01110 01110
else 1001 sn = 2 * sueldoBasico; 1001

if (a > 5 ) v = 15;
1 11 else{ 1 11
0 0 0 0
1 porc = p.obtenerPorcentaje(a); 1
else if (a >= 1) v = 7;
sn = sueldoBasico + (sueldoBasico * porc / 100); }
return v; return sn;
} }

3
La clase Operario La clase Operario
class Vendedor extends Empleado { class Operario extends Empleado {
//Atributos de instancia //Atributos de instancia
protected float ventasAcumuladas; protected int horas;
//Constructor //Constructor
public Vendedor (int leg, float sb, Fecha fi, float v){ public Operario (int leg, float sb, Fecha fi){
super(leg,sb,fi); super(leg,sb,fi);
ventasAcumuladas = v; } 01100
} 01100
//Comandos 10011 //Comandos 10011
10110 10110
public void acumularVentas(float m){ 01110 public void establecerHoras(int h){ 01110
ventasAcumuladas =+ m; } 01100
10011
horas = h; } 01100
10011
public void inicializarVentas (){ 10110 //Consultas 10110
01110 01110
ventasAcumuladas = 0; } 1001
public int obtenerHoras (){ 1001
//Consultas 1 11 return horas; } 1 11
0 0 0 0
public float obtenerVentaAcumulada(){ 1 public float obtenerPremio (float p){ 1
return ventasAcumuladas; } return horas * p ; }
public float obtenerComisionAnual(){ }
return ventasAcumuladas * 0.05;}
}

Clasificación La relación entre clases

Extensibilidad
Fecha Empleado Planilla

Supervisor Vendedor 01100 01100


10011 10011
10110 10110
01110 01110
01100 01100
10011 10011
10110 Operario Vendedor 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
Operario Supervisor

Empleado Todo objeto de clase Supervisor ES UNA instancia de Operario y


también de Empleado.

La clase Empleado La redefinición

Empleado Empleado Operario

<<Atributos>> <<Atributos>> <<Atributos>>


legajo: entero legajo: entero horas: entero
sueldoBasico: real sueldoBasico: real << Constructores>>
fechaIngreso: Fecha fechaIngreso: Fecha Operario(leg: entero, sb: real, fi: Fecha)
<<Comandos>>
<<Constructor>> 01100 <<Constructor>> establecerHoras(h: entero) 01100
10011 10011
Empleado(leg: entero, sb: real, fi: Fecha) 10110
Empleado(leg: entero, sb: real, fi: Fecha) <<Consultas>> 10110
<<Comandos>> 01110 <<Comandos>> obtenerPremio(p: real): real 01110
establecerSueldoBasico(sb: real) obtenerVacaciones(hoy: Fecha): entero 01100 establecerSueldoBasico(sb: real) 01100
10011 10011
<<Consultas>> Requiere hoy posterior a fechaIngreso. Retorna la 1 0 1 1 0 <<Consultas>> 10110
obtenerLegajo(): entero cantidad de días de vacaciones que le corresponden 0 1 1 1 0 obtenerLegajo(): entero 01110
obtenerSueldoBasico(): real 1001 obtenerSueldoBasico(): real Supervisor 1001
empleado.
1 11 1 11
obtenerFechaIngreso(): Fecha 7 si antigüedad mayor o igual a 1 y menor o igual a 5.
0 0
obtenerFechaIngreso(): Fecha << Constructores>> 0 0
obtenerAntiguedad(hoy: Fecha): entero 15 si antigüedad mayor a 5 y menor o igual a 10. 1 obtenerAntiguedad(hoy: Fecha): entero Supervisor(leg: entero, sb: real, fi: Fecha) 1
obtenerVacaciones(hoy: Fecha): entero 25 si antigüedad es mayor a 10. obtenerVacaciones(hoy: Fecha): entero <<Consultas>>
obtenerSueldoNeto(p: Planilla,hoy:Fecha):real Si tiene menos de 1 año, no tiene vacaciones obtenerSueldoNeto(p: Planilla,hoy:Fecha):real obtenerVacaciones(hoy: Fecha): entero

El cambio no afecta a las clases ya implementadas y verificadas

4
La redefinición La redefinición

Operario
<<Atributos>>
horas: entero
<< Constructores>>
Operario(leg: entero, sb: real, fi: Fecha) La redefinición se produce cuando una clase
<<Comandos>>
01100
derivada define un método con la misma 01100
establecerHoras(h: entero)
<<Consultas>>
10011
10110 signatura que un método de una clase ancestro. 10011
10110
obtenerPremio(p: real): real 01110 01110
01100 01100
10011 10011
10110 10110
01110 01110
Supervisor 1001 1001
1 11 1 11
<< Constructores>> 0 0 0 0
obtenerVacaciones(f: Fecha): entero Supervisor(leg: entero, sb: real, fi: Fecha) 1 1

Computa 2 días por año de antigüedad <<Consultas>>


hasta un máximo de 30 días obtenerVacaciones(hoy: Fecha): entero

La consulta obtenerVacaciones se redefine en Supervisor

El método obtenerVacaciones en Empleado El método obtenerVacaciones en Supervisor

class Empleado { class Supervisor extends Operario {


… //Constructor
public Supervisor (leg, float sb, Fecha fi){
public int obtenerVacaciones(Fecha hoy){
/*Requiere hoy posterior a fechaIngreso. Retorna la cantidad de días de
super(leg,sb,fi);
vacaciones que le corresponden empleado. }
7 si antigüedad mayor o igual a 1 y menor o igual a 5. //Consultas
15 si antigüedad mayor a 5 y menor o igual a 10. public int obtenerVacaciones(Fecha hoy){
01100 01100
25 si antigüedad es mayor a 10. 10011
/*Retorna 2 días por año de antigüedad 10011
Si tiene menos de 1 año, no tiene vacaciones */ 10110 hasta un máximo de 30 días */ 10110
int a = obtenerAntiguedad(hoy); 01110
01100
int a = obtenerAntiguedad(hoy); 01110
01100
int v = 0; 10011 int v = 2*a; 10011
10110
if (a > 10) v = 25; if (v > 30) 10110
01110 01110
else 1001 v = 30; 1001

if (a > 5 ) v = 15;
1 11 return v; 1 11
0 0 0 0
1 } 1
else if (a >= 1) v = 7;
}
return v;
} El método obtenerVacaciones de la clase Empleado queda

derogado para las instancia de la clase Supervisor.

La clase Empleado La sobrecarga

Empleado Empleado Vendedor


<<Atributos>> <<Atributos>> <<Atributo de instancia>>
legajo: entero legajo: entero ventaAcumulada: real
sueldoBasico: real sueldoBasico: real
<< Constructores>>
fechaIngreso: Fecha fechaIngreso: Fecha
Vendedor(leg: entero, sb: real, fi: Fecha, v: real)
<<Constructor>> <<Constructor>> <<Comandos>>
Empleado(leg: entero, sb: real, fi: Fecha) 01100 Empleado(leg: entero, sb: real, fi: Fecha) acumularVentas(m: real) 01100
10011 10011
<<Comandos>> 10110 <<Comandos>> iniciarlizarVentas () 10110
establecerSueldoBasico(sb: real) 01110 establecerSueldoBasico(sb: real) <<Consultas>> 01110
<<Consultas>> obtenerSueldoNeto(p: Planilla, hoy: Fecha): real
01100 <<Consultas>> obtenerVentaAcumulada():real 01100
10011 10011
obtenerLegajo(): entero Requiere p ligada y hoy posterior a fechaIngreso.1 0 1 1 0 obtenerLegajo(): entero obtenerComisionAnual():real 10110
obtenerSueldoBasico(): real 01110
Retorna el sueldo neto del empleado calculado como obtenerSueldoBasico(): real obtenerSueldoNeto(r:real):real 01110
obtenerFechaIngreso(): Fecha 1001 obtenerFechaIngreso(): Fecha 1001
el sueldo básico incrementado según un porcentaje1 11 1 11
obtenerAntiguedad(hoy: Fecha): entero dependiente de la antigüedad y obtenido de la planila
0 0 obtenerAntiguedad(hoy: Fecha): entero obtenerSueldoNeto(r:real): real 0 0
obtenerVacaciones(hoy: Fecha): entero 1
p.Si tiene 15 años o más el sueldo neto es el doble obtenerVacaciones(hoy: Fecha): entero El sueldo neto es el sueldo básico más la 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real del básico obtenerSueldoNeto(p: Planilla, hoy: Fecha): real rentabilidad r

El identificador obtenerSueldoNeto está sobrecargado

5
La sobrecarga El método obtenerSueldoNeto en Empleado
class Empleado {

public float obtenerSueldoNeto(Planilla p, Fecha hoy){
/*Requiere p ligada y hoy posterior a fechaIngreso
Retorna el sueldo neto del empleado calculado como el sueldo
Cuando dos o más métodos tienen el mismo básico incrementado según un porcentaje dependiente de la
nombre pero distinto tipo o número de antigüedad y obtenido de la planila p.
01100 01100
Si tiene 15 años o más el sueldo neto es el doble del básico*/
parámetros el identificador está sobrecargado. 10011
10110 int a = obtenerAntiguedad(hoy);
10011
10110
01110
01100
float sn = 0; 01110
01100
10011 int porc; 10011
10110 if (a >= 15) 10110
01110 01110
1001 sn = 2 * sueldoBasico; 1001
1 11 else{ 1 11
0 0 0 0
1 porc = p.obtenerPorcentaje(a); 1
sn = sueldoBasico + (sueldoBasico * porc / 100); }
return sn;
}

El método obtenerSueldoNeto en Vendedor El método obtenerSueldoNeto en Vendedor


class Vendedor extends Empleado { class Vendedor extends Empleado {
//Atributos de instancia //Atributos de instancia
protected float ventaAcumulada; protected float ventaAcumulada;

… …
public float obtenerSueldoNeto(float r){ public float obtenerSueldoNeto(float r){
/*El sueldo neto es el sueldo básico más la rentabilidad r*/ /*El sueldo neto es el sueldo básico más la rentabilidad r*/
01100 01100
return sueldoBasico + r; 10011
return obtenerSueldoBasico() + r; 10011
10110 10110
01110 01110
01100 01100
10011 10011
10110 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1

Como los atributos de la clase Empleado están protegidos, son Si sueldoBasico estuviera encapsulado solo podría accederse a
visibles para la clase Vendedor. través de los servicios públicos.

La sobrecarga y la redefinición HERENCIA

Empleado e1 = new Empleado(125,21000,f);


float obtenerComisionAnual();
Vendedor Operario e2 = new Operario(126,20000,f);
float obtenerSueldoNeto(float r);
Supervisor e3 = new Supervisor(120,30000,f);
int obtenerVacaciones(Fecha f); Vendedor e4 = new Vendedor(129,50000,f,10000);
Empleado int c;
float obtenerSueldoNeto(Planilla p,Fecha f);
01100 01100
10011 c = e1.obtenerVacaciones(h); Empleado Empleado 10011
10110 10110
01110 01110
Operario
Operario float obtenerPremio(float p); 01100 01100
10011
10110
c = e2.obtenerVacaciones(h); Empleado Operario
10011
Vendedor1 0 1 1 0
01110 01110
1001 1001
Supervisor
Supervisor int obtenerVacaciones(Fecha f); 1 11 1 11
0 0 c = e3.obtenerVacaciones(h); Supervisor Supervisor 0 0
1 1

Las clases derivadas heredan los atributos y métodos de la clase c = e4.obtenerVacaciones(h); Empleado
Empleado

6
HERENCIA HERENCIA

Empleado e1 = new Empleado(125,21000,f); Empleado e1 = new Empleado(125,21000,f);


Operario e2 = new Operario(126,20000,f); Operario e2 = new Operario(126,20000,f);
Supervisor e3 = new Supervisor(120,30000,f); Supervisor e3 = new Supervisor(120,30000,f);
Vendedor e4 = new Vendedor(129,50000,f,10000); Vendedor e4 = new Vendedor(129,50000,f,10000);
float c; float b1, b2, b3, b4, b5;
01100 01100
c = e1.obtenerPremio(15); Error Empleado 10011 b1 = e1.obtenerSueldoNeto(p,h); Empleado Empleado 10011
10110 10110
01110 01110
01100 01100
c = e2.obtenerPremio(15); Operario Operario
10011
Vendedor1 0 1 1 0 b2 = e2.obtenerSueldoNeto(p,h); Empleado Operario
10011
Vendedor1 0 1 1 0
01110 01110
1001 1001

c = e3.obtenerPremio(15); Operario Supervisor


1 11
b3 = e3.obtenerSueldoNeto(r); Error Supervisor
1 11
0 0 0 0
1 1

c = e4.obtenerPremio(15); Error b4 = e4.obtenerSueldoNeto(p,h); Empleado


b5 = e4.obtenerSueldoNeto(r); Vendedor

El concepto de polimorfismo El polimorfismo en Java

Una variable polimórfica puede quedar asociada a objetos


de diferentes clases.
El polimorfismo en Ciencias de la
Computación es el mecanismo que permite que 01100 01100

un mismo nombre esté asociado a distintas 10011


10110
Una asignación polimórfica liga un objeto de una clase a
10011
10110
01110 01110
abstracciones. 01100
10011
una variable declarada de otra clase. 01100
10011
10110 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 Un método polimórfico incluye una o más variables 1

polimórficas como parámetro.

Las variables polimórficas Las asignaciones polimórficas

Empleado e1, e2, e3, e4; Empleado e1, e2, e3, e4;

e1 = new Empleado(125,21000,f);
Empleado Empleado
e2 = new Operario(126,20000,f);
01100 01100
10011 e3 = new Supervisor(120,30000,f); 10011
Operario Vendedor
10110 Operario Vendedor
10110
01110 e4 = e3; 01110
01100 01100
10011 10011
Supervisor 10110 Supervisor 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1

Las variables e1, e2, e3 y e4 son polimórficas, pueden estar ligadas


a objetos de clase Empleado o cualquiera de sus clases derivadas

7
La ligadura dinámica La relación entre clases

Fecha
Empleado e1, e2, e3, e4;
int v;
e1 = new Empleado(125,21000,f);
Empleado Empleado Planta
e2 = new Operario(126,20000,f);
01100 01100
e3 = new Supervisor(120,30000,f); 10011 10011
Operario Vendedor
10110 10110
e4 = e3; 01110 01110
01100 01100
v = e1.obtenerVacaciones(h); Empleado 10011
Planilla 10011
Supervisor 10110 10110
v = e2.obtenerVacaciones(h); Empleado 01110
1001
01110
1001
v = e3.obtenerVacaciones(h); Supervisor 1 11
0 0
1 11
0 0
v = e4.obtenerVacaciones(h); Supervisor
1 1

Colección polimórfica Colección polimórfica


Empleado Planta Planta

<<Atributos>> t [] Empleado t [] Empleado


legajo: entero cant: entero cant: entero
sueldoBasico: real << Constructores>> << Constructores>>
fechaIngreso: Fecha Planta(max: entero) Planta(max: entero)
<<Comandos>> <<Comandos>>
<<Constructor>> alta(e: Empleado) alta(e: Empleado)
01100 01100
Empleado(leg: entero, sb: real, fi: Fecha) baja(leg: entero) 10011 baja(leg: entero) 10011
<<Comandos>> aumentarBasicos(p: real) 10110 aumentarBasicos(p: real) 10110
establecerSueldoBasico(sb: real) <<Consultas>> 01110 <<Consultas>> 01110
01100 01100
<<Consultas>> cantEmpleados() 10011 cantEmpleados() 10011
obtenerLegajo(): entero estaLlena(): boolean 10110 estaLlena(): boolean 10110
obtenerSueldoBasico(): real estaEmpleado(leg: entero): boolean 01110 estaEmpleado(leg: entero): boolean 01110
1001 1001
obtenerFechaIngreso(): Fecha basicoRango(l1, l2: real): entero 1 11 basicoRango(l1, l2: real): entero 1 11
obtenerAntiguedad(hoy: Fecha): entero netoRango(l1, l2: real, p: Planilla, hoy: Fecha): entero
0 0 masVacaciones(v: entero, hoy: Fecha): Planta netoRango(l1, l2: real, p: Planilla, hoy: Fecha): entero
0 0
obtenerVacaciones(hoy: Fecha): entero masVacaciones(v: entero, hoy: Fecha): Planta 1 Genera una colección con los empleados con masVacaciones(v: entero, hoy: Fecha): Planta 1
obtenerSueldoNeto(p: Planilla, hoy: Fecha): real más de v días de vacaciones
Las primeras cant posiciones están ligadas, las Las primeras cant posiciones están ligadas, las
demás no están ligadas. demás no están ligadas.

La relación entre clases Colección polimórfica


class Planta{
Fecha //Atributos de instancia
private Empleado[] t;
Vendedor private int cant;
//Constructor
Empleado Planta public Planta(int max){
01100
/*Crea una colección con max elementos*/ 01100
Operario 10011
10110
t = new Empleado [max]; 10011
10110
01110 cant = 0;} 01110
01100 01100
10011 10011
Planilla 10110 10110
01110 01110
Supervisor 1001 1001
1 11 1 11
0 0 0 0
1 1

t es una estructura polimórfica, mantiene referencias a objetos de


clase Empleado o de cualquiera de sus clases derivadas.

8
Colección polimórfica Colección polimórfica
public void alta (Empleado e){
planta :Planta /*asigna el empleado e a la primera posición libre de la estructura.
Aumenta el valor de cant. Requiere que la clase cliente haya
t
verificado que la estructura no esté llena, e esté ligado y no haya un
empleado con el mismo número de legajo*/
t[cant] = e;
cant cant++;
01100 01100
0 10011
} 10011
10110 10110
01110 01110
01100 01100
10011 10011
10110 10110
length 5 01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
Planta planta = new Planta(5); El comando alta es un método polimórfico, el parámetro real
puede ser de clase Empleado o de cualquiera de sus clases
descendientes.

Colección polimórfica Colección polimórfica


public void alta (Empleado e){
/*asigna el empleado e a la primera posición libre de la estructura. planta :Planta
Aumenta el valor de cant. Requiere que la clase cliente haya
t Operario
verificado que la estructura no esté llena, e esté ligado y no haya un
empleado con el mismo número de legajo*/
legajo
t[cant] = e;
cant++; cant sueldoBasico
01100 01100
} 10011
1 fechaIngreso 10011
10110 10110
01110 horas 01110
01100 01100
10011 10011
10110 10110
01110 length 5 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
Planta planta = new Planta(5); Planta planta = new Planta(5);
Operario o = new Operario(345,15000,f); Operario o = new Operario(345,15000,f);
planta.alta(o); planta.alta(o);

Colección polimórfica Colección polimórfica


public void alta (Empleado e){
planta :Planta /*asigna el empleado e a la primera posición libre de la estructura.
Aumenta el valor de cant. Requiere que la clase cliente haya
t Operario verificado que la estructura no esté llena, e esté ligado y no haya un
empleado con el mismo número de legajo*/
Vendedor legajo
t[cant] = e;
cant sueldoBasico cant++;
Vendedor legajo 01100 01100
3 fechaIngreso 10011
} 10011
sueldoBasico 10110 10110
legajo horas 01110 01110
fechaIngreso
sueldoBasico
ventasAcumuladas
01100
10011 La clase Planta es polimórfica porque define métodos 01100
10011
length 5 fechaIngreso 10110
01110 polimórficos. 10110
01110
ventasAcumuladas 1001 1001
1 11 1 11
0 0 0 0
1 1
Planta planta = new Planta(5); Planta planta = new Planta(5);
Operario o = new Operario(345,15000,f); Operario o = new Operario(345,15000,f);
planta.alta(o); planta.alta(o);
planta.alta(new Vendedor(346,20000,f,1000000)); planta.alta(new Vendedor(346,20000,f,1000000));
planta.alta(new Vendedor(347,25000,f,50000); planta.alta(new Vendedor(347,25000,f,50000);

9
El polimorfismo y la extensibilidad

Planta planta = new Planta(5); public Planta masVacaciones(int v, Fecha hoy){


if (cond) /*Genera una colección con los empleados con más de v días
planta.alta (new Operario (111,10000,f)); de vacaciones*/
else Planta nueva = new Planta(cantEmpleados());
planta.alta (new Vendedor (111,10000,f,0)); for (int i = 0; i < cantEmpleados(); i++)
if (t[i].obtenerVacaciones(hoy) > v)
01100 nueva.alta(t[i]); 01100
10011 10011
10110 return nueva; 10110
01110 01110
01100 } 01100
10011 10011
10110 10110
01110 01110
1001 1001
1 11 1 11
0 0 0 0
1 1
El compilador no conoce el valor de cond, de modo que no puede
saber si el primer empleado de la colección es un operario o un La implementación de Planta no cambia porque la clase Empleado
vendedor. se especialice en otras más específicas.

La productividad

La programación orientada a objetos favorece


la reusabilidad y la extensibilidad
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1

10

También podría gustarte