You are on page 1of 6

Taller de Herencia y Polimorfismo Se tiene la clase Empleado Para cada empleado se guarda un nombre, un sueldo y una fecha de contratacin.

Sobre un objeto de tipo empleado podemos invocar mtodos para conocer su nombre, incrementar su sueldo en un porcentaje y obtener el ao en que fue contratado:
import java.util.Calendar; import java.util.GregorianCalendar; public class Empleado { private String nombre; private double salario; private GregorianCalendar fechaContratacion; public Empleado(String n, double s, GregorianCalendar d) { nombre = n; salario = s; fechaContratacion = d; } public String getNombre() { return nombre; } public void setNombre(String nuevoNombre) { nombre = nuevoNombre; } public double getSalario() { return salario; } public void aumentarSalario(double porPorcentaje) { salario *= 1 + porPorcentaje / 100; } public GregorianCalendar getFechaContratacion() { return fechaContratacion; } public int aoContratacion() { return fechaContratacion.get(Calendar.YEAR); } public String fechaCortaContratacion(){ int dd, mm, aa;

dd = fechaContratacion.get(Calendar.DATE); mm = fechaContratacion.get(Calendar.MONTH) + 1; aa = fechaContratacion.get(Calendar.YEAR); return dd + "/" + mm +"/" + aa;

public void listar(){ System.out.println("Empleado : "+nombre+ " Salario : "+salario+" Fecha Contratacion : "+ fechaCortaContratacion() ); } }

Ejercicio 1 Crear una clase PruebaEmpleado (no hace falta gestionar la e/s) para probar la clase Empleado. Se tienen que instanciar unos cuantos empleados, mostrarlos por pantalla, aumentarles el sueldo en un porcentaje y finalmente mostrar de nuevo los datos para comprobar que se han modificado. . Introducir los empleados en un array para recorrerlo e imprimir los datos. Recordar que cuando realizamos una asignacin de tipos no primitivos, en realidad estamos asignando punteros, obteniendo dos referencias a un mismo objeto. Empleado a = new Empleado(David, 2000, new GregorianCalendar()); Empleado b = a; b.setNombre("Raul"); String str = a.getName(); System.out.println("Str : + str ); a) Ejercicio 2 Modificar la clase Empleado de manera que no se guarde el sueldo real sino el sueldo base por hora. Crear una nueva clase Turno con los mtodos int getHoraInicio(), int getHoraFin() e int obtenerHorasPorSemana(). La hora de inicio y fin del turno se pasan en el constructor. Las horas totales tienen que calcularse suponiendo que se trabaja 5 das por semanas. El obtenerSalario() de la clase Empleado de calcula en funcin de las horas totales del turno asignado al empleado correspondiente. Debe ser posible asignar un turno a un empleado en su construccin y debern aadirse los mtodos getTurno() y setTurno(). Crear una clase pruebaEmpleadoTurno() que compruebe que todo funcione bien. Indique el valor que muestra la variable str.

Ejercicio 3 Retomemos la clase Empleado y supongamos que nuestra aplicacin necesita manejar un nuevo concepto, el de directivo. Supongamos que en nuestra empresa los directivos tienen varias caractersticas que los diferencian de los empleados normales: tienen una secretaria y sus aumentos de sueldo se calculan de forma diferente al resto de empleados. Esto quiere decir que habr que definir una nueva clase Directivo. Pero hay otras caractersticas que los hacen parecidos al resto de empleados: tienen una fecha de contratacin, un nombre y un sueldo. Un Directivo tiene como subordinados a un nmero mximo de Subordinados. Este nmero mximo es una constante de clase. Un Directivo debe poder almacenar a sus subordinados; usar un array y crear un mtodo que permita aadirlos (no hace falta el consultor). Hay un subordinado especial, la secretaria: en lugar de los mtodos getNombreSecretaria() y setNombreSecretaria(String nombre), implementar los mtodos Empleado getSecretaria() y setSecretaria(Empleado e); Aprovechando lo que ya programado en Empleado desarrolle la clase Directivo haciendo que Directivo herede de Empleado. Para calcular el salario a Directivo, se le agrega bono adicional por cada ao de servicio: Ej: Bono = 0.5 * (Ao Actual Ao Contratacin) Va a tener que sobrescribir el mtodo aumentarSalario heredado de Empleado, para agregar esta caracterstica. A esto se le denomina sobrescribir un mtodo (Overriding). Empleado es la Superclase, Ancestro o Clase base y Directivo es la SubClase, Descendiente, o Clase Derivada. Recordar la visibilidad de los atributos y mtodos Un objeto de la clase Directivo tiene cuatro atributos: nombre, salario, fechaContratacion y nombreSecretaria. Pero los tres primeros estn declarados en Empleado con visibilidad private. Esto significa que no podemos acceder a ellos desde el cdigo de la clase Directivo. Slo podremos modificar o consultar los valores de estos atributos indirectamente con llamadas a mtodos public de la clase Empleado. As pues si quisiramos obtener el nombre del empleado deberamos hacerlos a travs del consultor getNombre: b) Indique que ocurre si tenemos el siguiente cdigo en la clase Directivo:

String n = Nombre;

Polimorfismo El polimorfismo es una caracterstica de todos los lenguajes que usan herencia. Consiste en que una misma referencia a objeto puede referenciar en distintas ejecuciones, o en distintos momentos de una misma ejecucin, a objetos con diferente tipo (diferente forma). Esto es debido a que a una variable de un tipo A podemos no slo asignarle objetos del tipo A, sino tambin cualquier objeto de un tipo que descienda de A. c) Indique que ocurre si tenemos el siguiente cdigo en la clase Directivo:

Empleado jefe = new Directivo( ...); jefe.getSala rio(); jefe.getNombreSecretari a();

d) Para la llamada al mtodo aumentarSalario, indicar cual implementacin se ejecutar, la de Empleado o la de Directivo? .
jefe.aumentarSalario(30) ;

Enlace dinmico El polimorfismo y el enlace dinmico pueden aprovecharse para hacer tratamientos generales de un conjunto de objetos de forma que para cada objeto se realice el clculo adecuado sin tener que preocuparnos del tipo especfico de cada objeto. e) Para el siguiente ejemplo que aumenta el salario a tres empleados. Explique el comportamiento de aumentar salario para cada uno de ellos:
Empleado[] plantilla = new Empleado[3] ; plantilla[0] = new Empleado(David, 2000, new GregorianCalendar(2000,1,1)) ; plantilla[1] = new Empleado(Goliat, 1000, new GregorianCalendar(1999,12,1)) ; plantilla[2] = new Directivo(Miguel, 3000, new GregorianCalendar(2003,11,1)); for (int i = 0; i < 3; i++) plantilla[i] .aumentarSalario(5);

Casting de objeto f) Explique que ocurre con la siguiente asignacin, y como se soluciona, si queremos efectivamente realizarla;
Empleado jefe = new Directivo("jefe", 2000, new GregorianCalendar()) ; Directivo m = jefe;

g)

Explique que ocurre con la siguiente sentencias;

Empleado jefe1 = new Empleado("jefe1", 1000, new GregorianCalendar()) ; Directivo m1 = (Directivo ) jefe;

h)

Corregir el cdigo para poder listar el nombre de la secretaria;

Empleado e = new Directivo("jefe", 2000, new GregorianCalendar()) ; System.out.println("Secretaria : + e.getNombreSecretaria());

La clase Object Cuando no especificamos superclase alguna de la cual heredar, estaremos heredando implcitamente de Object. As todas las clases en Java son descendientes de Object, lo que permite definir cierto comportamiento comn a todas las clases. Por ejemplo, en la clase Object hay un mtodo equals(Object obj) para comparar el objeto actual con el que se pasa por parmetro. Tal y como se encuentra definido en Object el mtodo usa == para la comparacin, es decir, devuelve true slo si las dos referencias apuntan al mismo objeto en memoria. Pero en cualquier clase que nosotros hagamos podemos sobrescribir este mtodo para que la comparacin se comporte adecuadamente. Por ejemplo, podemos hacer que se retorne true cuando ambos objetos referenciados coincidan en todos y cada uno de sus atributos. Tambin los mtodos finalize() y clone() estn definidos en Object, en este caso con cdigo vaco. Hay otro mtodo interesante en Object llamado toString(). Este devuelve una representacin del objeto en forma de String. Podemos sobrescribirlo para devolver una combinacin de los atributos del objeto que nos ayude a identificarlo. Este mtodo se llama cuando usamos el operador + para concatenar Strings con objetos.

Ejercicio 4 i) Modificar la clase Empleado para dotarla de los correspondientes mtodos equals, y toString j) Un Directivo tiene como subordinados a un nmero mximo de Subordinados. Este nmero mximo es una constante de clase. Un Directivo debe poder almacenar a sus subordinados; usar un array y crear un mtodo que permita aadirlos (no hace falta el consultor). Hay un subordinado especial, la secretaria: en lugar de los mtodos getNombreSecretaria() y setNombreSecretaria(String nombre), implementar losmtodos Empleado getSecretaria() y setSecretaria(Empleado e);

... continuar

You might also like