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()); }