Subido por Jose Suarez

arely1

Anuncio
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
Descargar