public abstract class Funcionario {
protected int matricula;
protected Date dataAdmissao;
public abstract double calcularProdutividade();
public void gerarRelatorioProdutividade()
double produtividade = calcularProdutividade();
//gerarRelatorio
}
}
public class Gerente extends Funcionario{
public double calcularProdutividade(){
return 80.0;
}
}
/////////////////////////////////////////////////////////////////////////
public interface Funcionario(){
public static final NOME_EMPRESA = "EMPRESA123";
public double calcularProdutividade();
public default void gerarRelatorio(){
double produtividade = calcularProdutividade();
// gerarRelatorio
}
}
public class FuncionarioPadrao implements Funcionario{
public double calcularProdutividade(){
return 100.0;
}
}
Podemos ter o mesmo funcionamento utilizando ambas estratégias, mas as classes abstratas permitem a herança de estados, podendo herdar os atributos "matricula" e "dataAdmissao", enquanto que com interfaces , temos somente a herança de "tipo" , podendo um objeto FuncionarioPadrao ser referenciado também como um Funcionario.