Abstracción y polimorfismo

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

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos