package com.trifulcas.herencia; public 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; 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; } }
package com.trifulcas.herencia; 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; } }
Empleado ana = new Empleado("Ana", 3000); System.out.println(ana); System.out.println(ana.sueldoNeto()); Comercial eva = new Comercial("Eva", 2500, 0.05); eva.setComision(0.05); eva.setVentas(10000); System.out.println(eva); System.out.println(eva.sueldoNeto()); Administrativo pepe=new Administrativo("Pepe",2000); pepe.setAntiguedad(20); System.out.println(pepe.sueldoNeto()); // Estoy creando una lista de empleados ArrayList<Empleado> empresa=new ArrayList<>(); // Añado ana porque es empleado empresa.add(ana); // Puedo añadir eva porque deriva de empleado empresa.add(eva); // Puedo añadir a pepe por la misma razón empresa.add(pepe); // Polimorfismo // Polimorfismo es utilizar métodos comunes en clases derivadas // Aunque tengan comportamientos diferentes // Yo puedo hacer lo siguiente: for(Empleado emp:empresa) { System.out.println(emp.getNombre() + " - " + emp.sueldoNeto()); }