Programacion Orientada a Objetos Ejemplo práctico: sistema de nómina utilizando polimorfismo En esta sección analizamos de nuevo la jerarquía EmpleadoPorComision-EmpleadoBaseMasComision. Ahora podemos usar un método abstracto y polimorfismo para realizar cálculos de nómina, con base en el tipo de empleado. Crearemos una jerarquía de empleados mejorada para resolver el siguiente problema: Una compañía paga a sus empleados por semana. Los empleados son de cuatro tipos: empleados asalariados que reciben un salario semanal fijo, sin importar el número de horas trabajadas; empleados por horas, que reciben un sueldo por hora y pago por tiempo extra, por todas las horas trabajadas que excedan a 40 horas; empleados por comisión, que reciben un porcentaje de sus ventas y empleados asalariados por comisión, que reciben un salario base más un porcentaje de sus ventas. Para este periodo de pago, la compañía ha decidido recompensar a los empleados asalariados por comisión, agregando un 10% a sus salarios base. La compañía desea implementar una aplicación en Java que realice sus cálculos de nómina en forma polimórfica. pág. 1 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos Clase Empleado package poliformismo; public abstract class Empleado { private String primerNombre; private String apellidoPaterno; private String numeroSeguroSocial; public Empleado( String nombre, String apellido, String nss ) { primerNombre = nombre; apellidoPaterno = apellido; numeroSeguroSocial = nss; } public void establecerPrimerNombre( String nombre ) { primerNombre = nombre; } public String obtenerPrimerNombre() { return primerNombre; } public void establecerApellidoPaterno( String apellido ) { apellidoPaterno = apellido; } public String obtenerApellidoPaterno() { return apellidoPaterno; } public void establecerNumeroSeguroSocial( String nss ) { numeroSeguroSocial = nss; } public String obtenerNumeroSeguroSocial() { return numeroSeguroSocial; } public String toString() { return String.format( "%s %s\nnumero de seguro social: %s", obtenerPrimerNombre(), obtenerApellidoPaterno(), obtenerNumeroSeguroSocial() ); } public abstract double ingresos(); } pág. 2 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos Clase EmpleadoAsalariado package poliformismo; public class EmpleadoAsalariado extends Empleado { private double salarioSemanal; public EmpleadoAsalariado( String nombre, String apellido, String nss, double salario ) { super( nombre, apellido, nss ); establecerSalarioSemanal( salario ); } public void establecerSalarioSemanal( double salario ) { salarioSemanal = salario < 0.0 ? 0.0 : salario; } public double obtenerSalarioSemanal() { return salarioSemanal; } public double ingresos() { return obtenerSalarioSemanal(); } public String toString() { return String.format( "empleado asalariado: %s\n%s: $%,.2f", super.toString(), "salario semanal", obtenerSalarioSemanal() ); } } Clase EmpleadoPorHoras package poliformismo; public class EmpleadoPorComision extends Empleado { private double ventasBrutas; private double tarifaComision; public EmpleadoPorComision( String nombre, String apellido, String nss, double ventas, double tarifa ) { super( nombre, apellido, nss ); establecerVentasBrutas( ventas ); establecerTarifaComision( tarifa ); } public void establecerTarifaComision( double tarifa ) { tarifaComision = ( tarifa > 0.0 && tarifa < 1.0 ) ? tarifa : 0.0; } pág. 3 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos public double obtenerTarifaComision() { return tarifaComision; } public void establecerVentasBrutas( double ventas ) { ventasBrutas = ( ventas < 0.0 ) ? 0.0 : ventas; } public double obtenerVentasBrutas() { return ventasBrutas; } public double ingresos() { return obtenerTarifaComision() * obtenerVentasBrutas(); } public String toString() { return String.format( "%s: %s\n%s: $%,.2f; %s: %.2f", "empleado por comision", super.toString(), "ventas brutas", obtenerVentasBrutas(), "tarifa de comision", obtenerTarifaComision() ); } } Clase EmpleadoBaseMasComision package poliformismo; public class EmpleadoBaseMasComision extends EmpleadoPorComision { private double salarioBase; public EmpleadoBaseMasComision( String nombre, String apellido, String nss, double ventas, double tarifa, double salario ) { super( nombre, apellido, nss, ventas, tarifa ); establecerSalarioBase( salario ); } public void establecerSalarioBase( double salario ) { salarioBase = ( salario < 0.0 ) ? 0.0 : salario; } public double obtenerSalarioBase() { return salarioBase; } public double ingresos() { return obtenerSalarioBase() + super.ingresos(); pág. 4 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos } public String toString() { return String.format( "%s %s; %s: $%,.2f", "con salario base", super.toString(), "salario base", obtenerSalarioBase() ); } } Clase PruebaSistemaNomina package poliformismo; public class PruebaSistemaNomina { public static void main( String args[] ) { EmpleadoAsalariado empleadoAsalariado = new EmpleadoAsalariado( "John", "Smith", "111-11-1111", 800.00 ); EmpleadoPorHoras empleadoPorHoras = new EmpleadoPorHoras( "Karen", "Price", "222-22-2222", 16.75, 40 ); EmpleadoPorComision empleadoPorComision = new EmpleadoPorComision( "Sue", "Jones", "333-33-3333", 10000, .06 ); EmpleadoBaseMasComision empleadoBaseMasComision = new EmpleadoBaseMasComision( "Bob", "Lewis", "444-44-4444", 5000, .04, 300 ); System.out.println( "Empleados procesados por separado:\n" ); System.out.printf( "%s\n%s: $%,.2f\n\n", empleadoAsalariado, "ingresos", empleadoAsalariado.ingresos() ); System.out.printf( "%s\n%s: $%,.2f\n\n", empleadoPorHoras, "ingresos", empleadoPorHoras.ingresos() ); System.out.printf( "%s\n%s: $%,.2f\n\n", empleadoPorComision, "ingresos", empleadoPorComision.ingresos() ); System.out.printf( "%s\n%s: $%,.2f\n\n", empleadoBaseMasComision, "ingresos", empleadoBaseMasComision.ingresos() ); Empleado empleados[] = new Empleado[ 4 ]; empleados[ empleados[ empleados[ empleados[ 0 1 2 3 ] ] ] ] = = = = empleadoAsalariado; empleadoPorHoras; empleadoPorComision; empleadoBaseMasComision; System.out.println( "Empleados procesados en forma polimorfica:\n" ); for ( Empleado empleadoActual : empleados ) { System.out.println( empleadoActual ); pág. 5 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos if ( empleadoActual instanceof EmpleadoBaseMasComision ) { EmpleadoBaseMasComision empleado = ( EmpleadoBaseMasComision ) empleadoActual; double salarioBaseAnterior = empleado.obtenerSalarioBase(); empleado.establecerSalarioBase( 1.10 * salarioBaseAnterior ); System.out.printf( "el nuevo salario base con 10%% de aumento es : $%,.2f\n", empleado.obtenerSalarioBase() ); } System.out.printf("ingresos $%,.2f\n\n", empleadoActual.ingresos() ); } for ( int j = 0; j < empleados.length; j++ ) System.out.printf( "El empleado %d es un %s\n", j, empleados[ j ].getClass().getName() ); } } pág. 6 Profesor: Mauricio Arturo Reyes Hernández Programacion Orientada a Objetos pág. 7 Profesor: Mauricio Arturo Reyes Hernández