Documentos de Académico
Documentos de Profesional
Documentos de Cultura
16 17 Herencia
16 17 Herencia
• 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
<<Atributos>>
legajo: entero
sueldoBasico: real
La herencia jerárquica es un mecanismo que fechaIngreso: Fecha
Reusabilidad
La clase Empleado La especialización de la clase Empleado
<<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
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.
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;}
}
Extensibilidad
Fecha Empleado Planilla
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
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.
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;
}
…
… …
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.
Las clases derivadas heredan los atributos y métodos de la clase c = e4.obtenerVacaciones(h); Empleado
Empleado
6
HERENCIA HERENCIA
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
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
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.
9
El polimorfismo y la extensibilidad
La productividad
10