JAVA
O que, exatamente, vem a ser a nossa classe Funcionario? Nossa empresa tem apenas Diretores, Gerentes, Secretárias, etc. Ela é uma classe que apenas idealiza um tipo, define apenas um rascunho.
Para o nosso sistema, é inadmissível que um objeto seja apenas do tipoFuncionario (pode existir um sistema em que faça sentido ter objetos do tipoFuncionario ou apenas Pessoa, mas, no nosso caso, não).
Usamos a palavra chave abstract para impedir que ela possa ser instanciada. Esse é o efeito direto de se usar o modificador abstract na declaração de uma classe: abstract class Funcionario {
protected double salario;
public double getBonificacao() { return this.salario * 1.2; }
// outros atributos e métodos comuns a todos Funcionarios
}
E, no meio de um código:
Funcionario f = new Funcionario(); // não compila!!!
O código acima não compila. O problema é instanciar a classe - criar referência, você pode. Se ela não pode ser instanciada, para que serve? Serve para o polimorfismo e herança dos atributos e métodos, que são recursos muito poderosos, como já vimos.
Vamos então herdar dessa classe, reescrevendo o método getBonificacao: class Gerente extends Funcionario {
public double getBonificacao() { return this.salario * 1.4 + 1000; }
}
Mas qual é a real vantagem de uma classe abstrata? Poderíamos ter feito isto com uma herança comum. Por enquanto, a única diferença é que não podemos instanciar um objeto do tipo Funcionario, que já é de grande valia, dando mais consistência ao sistema.
Fique claro que a nossa decisão de transformar Funcionario em uma classe abstrata dependeu do nosso domínio. Pode ser que, em um sistema com classes similares, faça sentido que uma classe análoga a Funcionario seja concreta.
Capítulo 10
Interfaces
"Uma imagem vale mil palavras. Uma interface vale mil imagens."
10.1 - Aumentando nosso exemplo
Imagine que um Sistema de Controle do Banco pode ser acessado, além de pelos