package com.trifulcas.herencia.abstraccion;
public abstract class Empleado {
private String nombre;
// Visible dentro de la propia clase y sus derivadas
protected double sueldo;
private double irpf=.85;
public Empleado(String nombre, double sueldo) {
super();
this.nombre = nombre;
this.sueldo = sueldo;
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
this.nombre = nombre;
}
/**
* @return the sueldo
*/
public double getSueldo() {
return sueldo;
}
/**
* @param sueldo the sueldo to set
*/
public void setSueldo(double sueldo) {
this.sueldo = sueldo;
}
@Override
public String toString() {
return "Empleado [nombre=" + nombre + ", sueldo=" + sueldo + "]";
}
public double sueldoNeto() {
return sueldo*irpf;
}
}
package com.trifulcas.herencia.abstraccion;
public class Administrativo extends Empleado {
private String departamento;
private int antiguedad=0;
/**
* @return the departamento
*/
public String getDepartamento() {
return departamento;
}
/**
* @param departamento the departamento to set
*/
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
/**
* @return the antiguedad
*/
public int getAntiguedad() {
return antiguedad;
}
/**
* @param antiguedad the antiguedad to set
*/
public void setAntiguedad(int antiguedad) {
this.antiguedad = antiguedad;
}
public Administrativo(String nombre, double sueldo) {
super(nombre, sueldo);
// TODO Auto-generated constructor stub
}
@Override
public double sueldoNeto() {
// Llamo al método de la clase madre que estoy sobreescribiendo
// con la palabra reservada super
return super.sueldoNeto()+antiguedad*100;
}
}
package com.trifulcas.herencia.abstraccion;
public class Comercial extends Empleado {
private double comision;
private double ventas;
public Comercial(String nombre, double sueldo, double comision) {
// Llamo al constructor de la clase madre
super(nombre, sueldo);
// Inicializo las propiedades de mi propia clase
this.comision=comision;
}
/**
* @return the comision
*/
public double getComision() {
return comision;
}
/**
* @param comision the comision to set
*/
public void setComision(double comision) {
this.comision = comision;
}
/**
* @return the ventas
*/
public double getVentas() {
return ventas;
}
/**
* @param ventas the ventas to set
*/
public void setVentas(double ventas) {
this.ventas = ventas;
}
// El sueldo de un comercial es el sueldo menos el irpf
// mas la comisión por las ventas
// SObre escribo el método
@Override
public double sueldoNeto() {
// Llamo al método de la clase madre que estoy sobreescribiendo
// con la palabra reservada super
return super.sueldoNeto()+comision*ventas;
}
}
// La clase Empleado es abstracta, por lo tanto no puedo instanciar
// Da error Empleado emp=new Empleado("foo",3000);
// Pero eso no impide que, en aras del polimorfismo, tengamos variables
// (e incluso listas) de tipo empleado
ArrayList<Empleado> empresa=new ArrayList<>();
// Estas variables se pueden instanciar porque sus clases no son abstractas
Comercial ana=new Comercial("Ana",2000,.02);
Administrativo eva=new Administrativo("Eva",2000);
Comercial pep=new Comercial("Pepe",1000,.04);
// Y las podemos añadir a una lista de empleados porque derivan de ella
// (Igual que lo podíamos hacer antes)
// Esto no es problemático, porque no instanciamos Empleado, sino las clases derivadas
empresa.add(pep);
empresa.add(eva);
empresa.add(ana);
// Podemos recorrer la lista con una variable 'empleado'
for(Empleado emp:empresa) {
System.out.println(emp.getSueldo());
}