PROGRAMACION ORIENTADA A OBJETOS: HERENCIA

domingo, 14 de febrero de 2010

9.5 Los constructores en las subclases

Nuestro siguiente ejemplo vuelve a la jerarquía de empleado de la Comisión, al declarar una clase CommissionEmployee4 (Figura 9.15) y una clase BasePlusCommissionEmployee5 (Figura 9.16). Cada constructor de la clase imprime un mensaje cuando se invoca, lo que nos permite observar el orden en que los constructores de la jerarquía de ejecutar.

Figura 9.15. Salidas de CommissionEmployee4 constructor de texto.


// Fig. 9.15: EmpleadoPorComision4.java
// La clase EmpleadoPorComision4 representa a un empleado por comisión.

public class EmpleadoPorComision4
{
private String primerNombre;
private String apellidoPaterno;
private String numeroSeguroSocial;
private double ventasBrutas; // ventas totales por semana
private double tarifaComision; // porcentaje de comisión

// constructor con cinco argumentos
public EmpleadoPorComision4( String nombre, String apellido, String nss,
double ventas, double tarifa )
{
// la llamada implícita al constructor de Object ocurre aquí
primerNombre = nombre;
apellidoPaterno = apellido;
numeroSeguroSocial = nss;
establecerVentasBrutas( ventas ); // valida y almacena las ventas brutas
establecerTarifaComision( tarifa ); // valida y almacena la tarifa de comisión

System.out.printf(
"\nConstructor de EmpleadoPorComision4:\n%s\n", this );
} // fin del constructor de EmpleadoPorComision4 con cinco argumentos

// establece el primer nombre
public void establecerPrimerNombre( String nombre )
{
primerNombre = nombre;
} // fin del método establecerPrimerNombre

// devuelve el primer nombre
public String obtenerPrimerNombre()
{
return primerNombre;
} // fin del método obtenerPrimerNombre

// establece el apellido paterno
public void establecerApellidoPaterno( String apellido )
{
apellidoPaterno = apellido;
} // fin del método establecerApellidoPaterno

// devuelve el apellido paterno
public String obtenerApellidoPaterno()
{
return apellidoPaterno;
} // fin del método obtenerApellidoPaterno

// establece el número de seguro social
public void establecerNumeroSeguroSocial( String nss )
{
numeroSeguroSocial = nss; // debe validar
} // fin del método establecerNumeroSeguroSocial

// devuelve el número de seguro social
public String obtenerNumeroSeguroSocial()
{
return numeroSeguroSocial;
} // fin del método obtenerNumeroSeguroSocial

// establece el monto de ventas brutas
public void establecerVentasBrutas( double ventas )
{
ventasBrutas = ( ventas < 0.0 ) ? 0.0 : ventas;
} // fin del método establecerVentasBrutas

// devuelve el monto de ventas brutas
public double obtenerVentasBrutas()
{
return ventasBrutas;
} // fin del método obtenerVentasBrutas

// establece la tarifa de comisión
public void establecerTarifaComision( double tarifa )
{
tarifaComision = ( tarifa > 0.0 && tarifa < 1.0 ) ? tarifa : 0.0;
} // fin del método establecerTarifaComision

// devuelve la tarifa de comisión
public double obtenerTarifaComision()
{
return tarifaComision;
} // fin del método obtenerTarifaComision

// calcula los ingresos
public double ingresos()
{
return obtenerTarifaComision() * obtenerVentasBrutas();
} // fin del método ingresos

// devuelve representación String del objeto EmpleadoPorComision4
public String toString()
{
return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f",
"empleado por comision", obtenerPrimerNombre(), obtenerApellidoPaterno(),
"numero de seguro social", obtenerNumeroSeguroSocial(),
"ventas brutas", obtenerVentasBrutas(),
"tarifa de comision", obtenerTarifaComision() );
} // fin del método toString
} // fin de la clase EmpleadoPorComision4



Figura 9.16. Salidas de BasePlusCommissionEmployee5 constructor de texto.

// Fig. 9.16: EmpleadoBaseMasComision5.java
// Declaración de la clase EmpleadoBaseMasComision5.

public class EmpleadoBaseMasComision5 extends EmpleadoPorComision4
{
private double salarioBase; // salario base por semana

// constructor con seis argumentos
public EmpleadoBaseMasComision5( String nombre, String apellido,
String nss, double ventas, double tarifa, double salario )
{
super( nombre, apellido, nss, ventas, tarifa );
establecerSalarioBase( salario ); // valida y almacena el salario base

System.out.printf(
"\nConstructor de EmpleadoBaseMasComision5:\n%s\n", this );
} // fin del constructor de EmpleadoBaseMasComision5 con seis argumentos

// establece el salario base
public void establecerSalarioBase( double salario )
{
salarioBase = ( salario < 0.0 ) ? 0.0 : salario;
} // fin del método establecerSalarioBase

// devuelve el salario base
public double obtenerSalarioBase()
{
return salarioBase;
} // fin del método obtenerSalarioBase

// calcula los ingresos
public double ingresos()
{
return obtenerSalarioBase() + super.ingresos();
} // fin del método ingresos

// devuelve representación String de EmpleadoBaseMasComision5
public String toString()
{
return String.format( "%s %s\n%s: %.2f", "con sueldo base",
super.toString(), "sueldo base", obtenerSalarioBase() );
} // fin del método toString
} // fin de la clase EmpleadoBaseMasComision5



Figura 9.17 se muestra el orden en que los constructores son llamados para objetos de clases que son parte de una jerarquía de herencia. Principal método comienza por crear instancias de objeto CommissionEmployee4 employee1 (líneas 89). A continuación, las líneas de 1214 una instancia de BasePlusCommissionEmployee5 objeto employee2. Esto invoca el constructor CommissionEmployee4, que imprime la salida con los valores pasados desde el constructor BasePlusCommissionEmployee5, a continuación, realiza la salida especificada en el constructor BasePlusCommissionEmployee5. Líneas de 1719 luego una instancia de BasePlusCommissionEmployee5 objeto employee3. Una vez más, la CommissionEmployee4 y constructores BasePlusCommissionEmployee5 son llamados. En cada caso, el cuerpo del constructor CommissionEmployee4 se ejecuta antes que el cuerpo del constructor BasePlusCommissionEmployee5 ejecuta. Tenga en cuenta que employee2 está construido completamente antes de la construcción de employee3 comienza.




// Fig. 9.17: PruebaConstructores.java
// Muestra el orden en el que se llaman los constructores de la superclase y la subclase.

public class PruebaConstructores
{
public static void main( String args[] )
{
EmpleadoPorComision4 empleado1 = new EmpleadoPorComision4(
"Bob", "Lewis", "333-33-3333", 5000, .04 );

System.out.println();
EmpleadoBaseMasComision5 empleado2 =
new EmpleadoBaseMasComision5(
"Lisa", "Jones", "555-55-5555", 2000, .06, 800 );

System.out.println();
EmpleadoBaseMasComision5 empleado3 =
new EmpleadoBaseMasComision5(
"Mark", "Sands", "888-88-8888", 8000, .15, 2000 );
} // fin de main
} // fin de la clase PruebaConstructores




No hay comentarios:

Publicar un comentario