Introduccin a la Programacin Orientada a Objetos Herencia
Introducción a la Programación Orientada a Objetos Herencia y Polimorfismo Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre 2019 Sonia Rueda
El proceso de clasificación realizado en un diseño orientado a objetos se organiza en niveles. En el primer nivel los objetos se agrupan en clases de acuerdo a sus atributos y comportamientos. En el segundo nivel del proceso de clasificación las clases se estructuran a través de un mecanismo de especialización-generalización llamado herencia. La herencia favorece la reusabilidad y la extensibilidad del software. Introducción a la Programación Orientada a Objetos Herencia
Caso de Estudio: Clientes y Empleados Una empresa mantiene información referida a sus empleados y clientes, en el primer caso con el objetivo fundamental de liquidar sueldos y en el segundo para mantener el saldo en cuenta corriente que se actualiza a partir de ventas y cobros. El sueldo de un empleado se calcula a partir de su antigüedad en la empresa, su salario básico y la cantidad de hijos. Esto es, al salario básico se le suma $1000 si tiene entre 10 y 15 años de antigüedad y $2000 si tiene más de 15 años de antigüedad. A este valor se le suma un valor dado por cada hijo. Los días de vacaciones se calculan a partir de la antigüedad. Una semana cuando cumple 1 año, 2 semanas cuando cumple 5 años y 3 semanas cuando su antigüedad es mayor a 10 años.
Cada empleado tiene un nombre y algunos datos postales como calle, número, teléfono y dirección de correo electrónico, una fecha de ingreso a la empresa, un salario básico y una cantidad de hijos. Durante su permanencia en la empresa pueden modificarse los datos postales, el salario o la cantidad de hijos. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Cada cliente tiene un nombre y algunos datos postales como calle, número, teléfono y dirección de correo electrónico, una ciudad, un saldo adeudado, un número de CUIT y una categoría de IVA. El saldo aumenta cada vez que se registra una operación de venta y disminuye con los cobros. Los clientes también pueden tener hijos pero esta información no es relevante para la empresa. Del mismo modo aunque los empleados también viven en una ciudad, todos viven en la misma, de modo que no es necesario representarla como una variable de instancia. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
El cliente efectúa compras y pagos de facturas. Ninguno de estos servicios tiene significado para un Empleado, así como no tiene sentido calcular el sueldo de un Cliente. En realidad podría darse el caso que un Empleado de la empresa en ocasiones sea Cliente de la misma. En ese caso una misma entidad del problema está cumpliendo dos roles, pertenece a dos clases. El modelo es entonces un poco más complejo, por el momento no nos ocuparemos de este tipo de situaciones. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Si agrupamos a empleados y clientes en una única clase, por ejemplo, Persona, los atributos podrían ser: Persona <<atributos de instancia>> nombre … calle. Nro telefono email ciudad fecha. Ingreso basico cant. Hijos saldo cuit cate. Iva Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Si definimos un modelo para cada grupo de entidades: Empleado Cliente <<atributos de instancia>> nombre … calle. Nro telefono email fecha. Ingreso basico cant. Hijos <<atributos de instancia>> nombre … calle. Nro telefono email ciudad saldo cuit cate. Iva Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
La primera alternativa no es adecuada porque el modelo incluye más atributos y comportamiento que el que realmente caracteriza a un empleado o cliente específico. La segunda alternativa tiene redundancia, parte de los atributos y del comportamiento se repite en las dos clases. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados Persona Cliente Empleado Un modelo más adecuado factoriza los atributos y comportamiento compartidos de Cliente y Empleado en una clase general y retiene los atributos y comportamientos específicos en clases especializadas.
Las clases Cliente y Empleado se vinculan con la clase Persona a través de un relación de herencia. La organización es jerárquica, la clase Persona es más general y las clases Cliente y Empleado son más específicas. La colección de clases se dibuja como un árbol, las clases generales ocupan los niveles superiores y las clases más específicas ocupan los niveles inferiores. En Java la clase más general es Object. Todas las clases que implementamos heredan implícitamente de Object. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Persona <<atributos de instancia>> nombre : String calle. Nro : String telefono : String email : String <<Constructores>> Inicializa todos los atributos con cadenas nulas Persona() Persona(nom : String) Persona(nom: String, cn: String, t: String, e: String) Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Persona <<atributos de instancia>> nombre : String calle. Nro : String telefono : String email : String <<Constructores>> … <<Comandos>> establecer. Calle. Nro (d: String) … <<Consultas>> obtener. Calle. Nro () : String Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados Cliente <<atributos de instancia>> saldo : real ciudad : String CUIT : String cate. IVA : char <<Constructores>> Cliente() Cliente (nom : String) Cliente(nom: String, cn: String, t: String, e: String, s: real, c: String, cu: String, ci: char) Cliente() Inicializa saldo en 0, ciudad con “Bahía Blanca” CUIT con 12 espacios y categoría de IVA con “I”
Cliente <<atributos de instancia>> saldo : real ciudad : String CUIT : String cate. IVA : char <<Constructores>> … <<Comandos>> registrar. Venta ( m : real) registrar. Cobro (m: real) <<Consultas>> obtener. Saldo () : real Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Empleado <<atributos de instancia>> basico : real cant. Hijos : entero fecha. Ingreso : Fecha <<Constructores>> Empleado() Empleado(nom : String) Empleado(nom: String, cn: String, t: String, e: String, b: real, ch: entero, fi : Fecha) Empleado() Inicializa basico en 5000, cant. Hijos en 0 y fecha. Ingreso en 1/1/2005 Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Caso de Estudio: Clientes y Empleados <<atributos de instancia>> basico : real cant. Hijos : entero fecha. Ingreso : Fecha <<Constructores>>… <<Comandos>> establecer. Basico (sb : real ) aumentar. Basico (a: real )… <<Consultas>> mas. Antiguo(e : Empleado ) : booleano obtener. Basico () : real sueldo. Neto (mh: real) : real dias. Vacaciones () : entero mas. Antiguo(e : Empleado ): booleano Retorna verdadero si el empleado que recibe el mensaje es más antiguo que el argumento sueldo. Neto (mh: real) : real Introducción a la Programación Orientada a Objetos Empleado Retorna el salario básico más $1000 si tiene entre 10 y 15 años de antigüedad y $2000 si tiene más de 15 años de antigüedad. A este valor se le suma $h por cada hijo. dias. Vacaciones () : entero Retorna 7 días si la antigüedad es mayor a 1 año y menor a 5, 15 días a partir de 5 años y 21 días a partir de 10 años.
Caso de Estudio: Clientes y Empleados Introducción a la Programación Orientada a Objetos Persona <<atributos de instancia>> … <<Constructores>> … <<Comandos>> establecer. Calle. Nro (d: String) … <<Consultas>> obtener. Calle. Nro () : String Cliente Empleado <<atributos de instancia>> saldo : real ciudad : String CUIT : String cate. IVA : char <<Constructores>> <<Comandos>> registrar. Venta ( m : real) registrar. Cobro (m: real) <<Consultas>> obtener. Saldo () : real <<atributos de instancia>> basico : real cant. Hijos : entero fecha. Ingreso : Fecha <<Constructores>>… <<Comandos>> establecer. Basico (real sb) aumentar. Basico (real a)… <<Consultas>> mas. Antiguo(Empleado e) : booleano obtener. Basico () : real sueldo. Neto (mh : entero) : real dias. Vacaciones () : entero
Las clases Cliente y Empleado especializan a la clase Persona. Alternativamente podemos decir que Persona generaliza a las clases Cliente y Empleado son subclases o clase derivadas de la superclase o clase base Persona. El acceso a los atributos y servicios de una clase desde sus clases derivadas depende del nivel de encapsulamiento. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Persona { //Atributos de instancia protected String nombre; protected String calle. Nro; protected String telefono; protected String email; … } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
//Constructores public Persona(){ nombre = new String(); calle. Nro = new String(); telefono = new String(); email = new String(); } public Persona (String nom){ nombre = nom; calle. Nro = new String(); telefono = new String(); email = new String(); } public Persona (String nom, String cn, String tel, String em){ nombre = nom; calle. Nro = cn; telefono = tel; email = em; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Empleado extends Persona { //Atributos de instancia protected float basico; protected Fecha fecha. Ing; protected int hijos; … } Las clases derivadas de la clase Persona acceden a sus constructores usando el comando super(). Si un constructor usa el constructor de la clase base, la instrucción super() debe ser la primera del bloque. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
//Constructores public Empleado(){ super(); basico = 5000; cant. Hijos = 0; fecha. Ingreso = new Fecha(1, 1, 2005); } public Empleado(String nom){ super(nom); basico = 5000; cant. Hijos = 0; fecha. Ingreso = new Fecha(1, 1, 2005); } public Empleado(String nom, String cn, String te, String em, float sb, int ch, Fecha f ){ super(nom, cn, te, em); basico = sb; cant. Hijos = ch; fecha. Ingreso = f; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
La clase Empleado hereda de la clase Persona todas las variables de clase, de instancia y métodos. nombre calle. Nro telefono email basico cant. Hijos fechaingreso Un objeto de clase Empleado tiene todos los atributos de una Persona más los específicos de su clase. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class gestion. Empresa{ Empleado e; e = new Empleado (…); String nom = e. obtener. Nombre(); float bas= e. obtener. Basico(); } Un objeto de clase Empleado puede recibir todos los mensajes válidos para los objetos de clase Persona más los específicos de su clase. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
La clase Cliente hereda de la clase Persona todas las variables de clase, de instancia y métodos. nombre calle. Nro telefono email saldo ciudad CUIT cate. Iva Un objeto de clase Cliente tiene todos los atributos de una Persona más los específicos de su clase. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class gestion. Empresa{ Cliente c; c = new Cliente (…); String nom = e. obtener. Nombre(); float s = e. obtener. Saldo(); } Un objeto de clase Cliente puede recibir todos los mensajes válidos para los objetos de clase Persona más los específicos de su clase. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
La herencia establece una relación de tipo es-un (isa) ya que todo objeto de clase Cliente es también un objeto de clase Persona. Un objeto de clase Cliente estará caracterizado por todos los atributos y servicios definidos en la clase, pero además hereda los atributos y servicios de la clase Persona. Análogamente entre la clase Empleado y la clase Persona existe una relación de tipo es-un. Una objeto de clase Empleado está caracterizado por todos los atributos definidos en su clase , pero además hereda los atributos y servicios de la clase Persona. Un objeto de clase Persona no puede recibir mensajes que correspondan a servicios provistos por las clases derivadas. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
La empresa decide establecer un monto por productividad y un presupuesto para cada ejecutivo y un monto diario para viáticos común para todos los ejecutivos. Además se decide que todos los ejecutivos tengan 20 días de vacaciones. Cada ejecutivo recibe un premio anual equivalente al 3% de su productividad. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados Ejecutivo <<atributos de clase>> viaticos = 1200 <<atributos de instancia>> productividad: real presupuesto : real <<Constructores>> Ejecutivo(nom: String, cn: String, t: String, e: String, b: real, ch: entero, fi : Fecha, pre: real) <<Comandos>> establecer. Productividad (p: real ) aumentar. Presupuesto (a: real )… <<Consultas>> obtener. Pres () : real dias. Vacaciones () : entero premio. Anual(): real dias. Vacaciones () : entero 20 días premio. Anual(): real El 3% de la productividad
Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados Persona Cliente Empleado Ejecutivo La clase Ejecutivo especializa a la clase Persona. Todo objeto de clase Ejecutivo es también instancia de las clases Empleado y Persona.
Persona <<atributos de instancia>>… <<Constructores>>… <<Comandos>>… <<Consultas>>… Empleado <<atributos de instancia>>… <<Constructores>>… <<Comandos>>… <<Consultas>>… Ejecutivo <<atributos de instancia>>… <<Constructores>>… <<Comandos>>… <<Consultas>>… Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Persona { //Atributos de instancia protected String nombre; protected String calle. Nro; protected String telefono; protected String email; … } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Empleado extends Persona { //Atributos de instancia protected float basico; protected Fecha fecha. Ing; protected int hijos; … } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Ejecutivo extends Empleado { //Atributos de clase protected float viaticos; //Atributos de instancia protected float presupuesto; protected float productividad; … } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
public Persona (String nom, String cn, String tel, String em){ nombre = nom; calle. Nro = cn; telefono = tel; email = em; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
public Empleado(String nom, String cn, String te, String em, float sb, int ch, Fecha f ){ super(nom, cn, te, em); basico = sb; cant. Hijos = ch; fecha. Ingreso = f; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
public Ejecutivo (String nom, String cn, String te, String em, float sb, int ch, Fecha f, float pres ){ super(nom, cn, te, em, sb, ch, f); productividad = 0; presupuesto = pres; } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Empleado <<Consultas>> dias. Vacaciones () : real Ejecutivo <<Consultas>> dias. Vacaciones () : real Una clase derivada puede redefinir un método de una de sus clase ancestro, si especifica el mismo nombre, número y tipo de parámetros. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
class Empleado extends Persona{ … public int dias. Vacaciones() { /*Retorna 7 días si la antigüedad es mayor a 1 año y menor a 5, 15 días a partir de 5 años y 21 días a partir de 10 años. */ int ant = fecha. Ing. dif. Hoy(); int vac = 0; if (ant > 10) vac =21; 1 else if (ant >= 5) vac = 14; else if (ant > 0) vac = 7; return vac; } } Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados
Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados class Ejecutivo extends Empleado{ … public int dias. Vacaciones () { //20 días return 20; } } 2
Dadas las siguientes declaraciones: Empleado v 1 = new Empleado(e 1, e 2, e 3, e 4, e 5, e 6, e 7); Ejecutivo v 2 = new Ejecutivo(j 1, j 2, j 3, j 4, j 5, j 6, j 7, j 8); System. out. println(v 1. dias. Vacaciones()); System. out. println(v 2. dias. Vacaciones()); System. out. println(v 1. obtener. Pres()); System. out. println(v 2. obtener. Pres()); Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados 1 2
Dadas las siguientes declaraciones: Empleado v 1, v 2; v 1=new Empleado(e 1, e 2, e 3, e 4, e 5, e 6, e 7); v 2=new Ejecutivo(j 1, j 2, j 3, j 4, j 5, j 6, j 7, j 8); System. out. println(v 1. dias. Vacaciones()); System. out. println(v 2. dias. Vacaciones()); System. out. println(v 1. obtener. Pres()); System. out. println(v 2. obtener. Pres()); Las variables v 1 y v 2 son polimórficas. La ligadura entre el mensaje y el método es dinámica. Introducción a la Programación Orientada a Objetos Caso de Estudio: Clientes y Empleados 1 2
- Slides: 43