A ver, el enunciado ya nos da bastantes pistas.
Todas las clases heredan de la superclase
Personal, que es la que ha de tener los atributos y métodos comunes a todas las demás clases. Así que empecemos por ella:
Todo el personal se identifica con su nombre y DNI y recibe un salario mensual que debemos de calcular, de forma simplificada, como el número de horas de trabajo a la semana multiplicado por el importe/hora de su categoría y por el número de semanas al mes (4).
Así que de momento esta podría ser la clase
Personal. Puede que luego se deba modificar, o no..
public class Personal {
//Atributos
protected String DNI;
protected String nombre;
protected int salario;
//Constructor
public Personal(String DNI, String nombre) {
this.DNI = DNI;
this.nombre = nombre;
}
//Métodos
public String getDNI() {
return DNI;
}
public void setDNI(String DNI) {
this.DNI = DNI;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void calcularSalario() {
//Este cálculo dependerá de las clases hijas
}
}
Yo habría declarado esta clase como "abstracta" pero por no alterar las plantillas que han dado hechas, no lo haremos.
El salario es un cálculo que se hace en un momento dado (a final de mes para pagar la nómina) y además depende las clases hijas.
Sigamos...
Detrás de
Personal, tenemos las categorias
PAS y
PDIVeamos que nos dicen de los
PASPAS: En un mes determinado los PAS (tanto administrativos como informáticos) pueden acumular horas extras. Cada hora extra se paga a 6 euros/hora. Las horas extra, una vez pagadas, se inicializan a cero de nuevo (por ejemplo, a la hora de calcular el sueldo de personal).
Esto quizás se podría modelar de esta manera:
public class PAS extends Personal{
//Atributos
private final int VALOR_HORA_EXTRA = 600; //6€
protected int horasExtra;
//Constructor
public PAS(String DNI, String nombre) {
super(DNI, nombre);
horasExtra = 0;
}
//Métodos
public void acumularHorasExtra(int horas) {
horasExtra += horas;
}
public int calcularHorasExtra() {
int extra = horasExtra * VALOR_HORA_EXTRA;
horasExtra = 0; //Reinicio a 0
return extra;
}
}
OK, ¿y de los PDI?
Pues de los PDI no nos dicen nada, así que esta clase parece que por ahora se va a quedar así:
public class PDI extends Personal{
public PDI(String DNI, String nombre) {
super(DNI, nombre);
}
}
Es una clase que no va a aportar nada, más allá de ser una subclase intermedia entre la superclase y las clases hijas
Profesor e
Investigador.
Por cierto, de
Profesor si nos dicen que tienen un ingreso adicional:
Profesores: A los profesores se les añade un complemento salarial en función de lo que se conoce como sexenios (periodos de 6 años evaluados positivamente), y que se pueden conceder hasta un máximo de 6. En concreto, se les añade 100 euros al mes por sexenio reconocido. Una vez concedido el sexenio el aumento de sueldo se mantiene para siempre.
Lo cuál es un complemento de su cálculo salarial base:
Profesores: 37 horas/semana con un importe de 8 euros/hora.
Así que la clase
Profesor podría ser esta.
Fíjate que para el calculo de salario, lo que hacemos es "sobre escribir"(Override) el método que viene heredado de la clase
Personalpublic class Profesor extends PDI{
private final int VALOR_SEXENIO = 100000; //100€
private final int HORAS_SEMANA = 37;
private final int VALOR_HORAS = 800; //8€
private int sexenios;
public Profesor(String DNI, String nombre, int sexenios) {
super(DNI, nombre);
this.sexenios = 0;
aumentarSexenios(sexenios);
}
public void aumentarSexenios(int sexenios) {
this.sexenios += sexenios;
if (sexenios > 6) //Máximo 6 sexenios
sexenios = 6;
}
@Override
public void calcularSalario() {
//Sueldo base
salario = HORAS_SEMANA * VALOR_HORAS;
salario *= 4;//4 semanas de salario
//Complemento sexenios
salario += (sexenios * VALOR_SEXENIO);
}
}
El otro
PDI, la clase
Investigador, no tiene complementos, así que segun su salario base...
Investigadores: 35 horas/semana con un importe de 7 euros/hora.
...queda así:
public class Investigador extends PDI{
private final int HORAS_SEMANA = 35;
private final int VALOR_HORAS = 700; //7€
public Investigador(String DNI, String nombre) {
super(DNI, nombre);
}
@Override
public void calcularSalario() {
salario = HORAS_SEMANA * VALOR_HORAS;
salario *= 4;//4 semanas de salario
}
}
Nos faltan los dos
PASTenemos
AdministrativoAdministrativos: 37 horas/semana y un importe de 7,5 euros/hora.
a lo que hay que sumarle el valor de sus horas extra por ser un
PASpublic class Administrativo extends PAS{
private final int HORAS_SEMANA = 37;
private final int VALOR_HORAS = 750; //7,5€
public Administrativo(String nombre, String dni, int horasExtra) {
super(nombre, dni);
this.horasExtra = horasExtra;
}
@Override
public void calcularSalario() {
salario = HORAS_SEMANA * VALOR_HORAS;
salario *= 4;//4 semanas de salario
salario += calcularHorasExtra(); //Método heredado de PAS
}
}
Y lo mismo con los
InformaticoInformáticos: 40 horas/semanas y un importe de 6 euros/hora.
public class Informatico extends PAS{
private final int HORAS_SEMANA = 40;
private final int VALOR_HORAS = 600; //6€
public Informatico(String nombre, String dni, int horasExtra) {
super(nombre, dni);
this.horasExtra = horasExtra;
}
@Override
public void calcularSalario() {
salario = HORAS_SEMANA * VALOR_HORAS;
salario *= 4; //4 semanas de salario
salario += calcularHorasExtra(); //Método heredado de PAS
}
}
Pasemos a la clase
Universidad• Crear una clase Universidad con una función public static void imprimirNominas(Personal[] listaPersonal) que imprima por pantalla, para cada Personal incluido en listaPersonal, el nombre del personal, su categoría y su sueldo.
• Crear en la misma clase Universidad, una función obtenerPresupuestoTotal que devuelva el total de dinero que se gasta la universidad en personal.
Para evitar usar decimales en cantidades monetarias podemos trabajar con el dinero en céntimos de Euro y solo convertirlo en euros a la hora de mostrarlo por pantalla.
Aquí lo tenemos:
public class Universidad {
public static void imprimirNominas(Personal[] listaPersonal) {
System.out.println("\n\t\tNOMINAS DEL PERSONAL");
for (Personal pers: listaPersonal) {
pers.calcularSalario();
String categoria;
if (pers instanceof Administrativo || pers instanceof Informatico)
categoria = "PAS";
else
categoria = "PDI";
System.out.printf("-> Nombre: %-25s Categoria: %-15s Sueldo: %.2f\n",
pers.getNombre(), categoria, pers.salario / 100f);
}
}
public static long obtenerPresupuestoTotal(Personal[] listaPersonal) {
int total = 0;
for (Personal pers: listaPersonal)
total += pers.salario;
return total;
}
}
Y por último el main para ponerlo a prueba.
Yo hago un ejemplo con solo 4 personas, tú añade más si quieres.
public class Main {
public static void main(String[] args) {
//Crear personal
Personal[] listaPersonal = new Personal[4];
listaPersonal[0] = new Administrativo("45678901X", "Luis Segura", 15);
listaPersonal[1] = new Informatico("34890012M", "Ana Montes", 23);
listaPersonal[2] = new Investigador("23987634K", "Susana Rego");
listaPersonal[3] = new Profesor("43789011G", "Antonio Paz", 4);
//Imprimir las nóminas
Universidad.imprimirNominas(listaPersonal);
//Ver el presupuesto total
System.out.printf("\nPresupuesto total: %.2f",
Universidad.obtenerPresupuestoTotal(listaPersonal) / 100f);
}
}
Pregunta si algo no se entiende.
Un saludo.