Orientação a Objetos Classes Abstratas Material baseado na apostila FJ-11: Java e Orientação a Objetos do curso Caelum, Ensino e Inovação, disponível para download em http://www.caelum.com.br/apostilas/ 1
Objetivos Dizer o que são classes abstratas e quando utilizá-las; 2
Ainda a classe Funcionário Vamos relembrar o código da classe Funcionário, base da hierarquia de classes representando os empregados de nossa empresa. 3
Polimorfismo A classe Funcionário permite que toda a hierarquia seja usada de forma polimórfica. 4
Hierarquia de Classes Observe que a classe Funcionário, superclasse de toda a hierarquia de empregados, é utilizada aqui com duas finalidades: Fornecer código comum às subclasses, evitando assim a duplicação de código Habilitar o polimorfismo, fornecendo uma referência comum a todas as classes da hierarquia. 5
Observação Quando uma classe é usada como uma referência polimórfica para todas as classes da hierarquia, somente os métodos definidos na interface da superclasse podem ser invocados usando a referência polimórfica. Discussão em sala de aula: a analogia com as televisões e o controle remoto. 6
Exemplo 7
Exemplo (continuação) A classe Funcionário não tem o método setsenha() erro de compilação. 8
Dúvidas Para o nosso domínio, faz sentido criar uma instância de Funcionário? O conceito de Funcionário não está abstrato demais? Todos os Funcionários não tem um tipo mais concreto (Gerente, Diretor, Presidente, Engenheiro, Secretária, etc)? Existe alguém na empresa classificado apenas como Funcionário? 9
Classes Abstratas Podem haver situações em que a superclasse da hierarquia é importante para: 1. fornecer código comum às subclasses 2. habilitar o polimorfismo (servir como referência comum a toda a hierarquia) No entanto, pode não fazer sentido criar uma instância da superclasse 10
Classes Abstratas Para impedir que uma classe seja instanciada, basta acrescentar a palavra reservada static a sua declaração. 11
Classes Abstratas Observe agora o que ocorre se tentarmos criar uma instância da classe Funcionário. 12
Classes Abstratas Assim como antes, podemos ainda estender a classe Funcionario e, se necessário, sobrescrever alguns métodos. 13
Métodos abstratos Uma vez que, no nosso exemplo, todo funcionário é um funcionário concreto (Diretor, Gerente, Engenheiro, Vendedor, etc.), com uma regra de negócio própria para o cálculo da bonificação, qual deve ser a implementação do método getbonificacao() na classe Funcionario? Em outras palavras, muitas vezes existem métodos para os quais não existe qualquer código comum para ser herdado pelas subclasses. Nesses casos, podemos tirar esses métodos da superclasse? 14
Métodos abstratos (continuação) Nesses casos, podemos tirar esses métodos da superclasse? Existem dois casos a considerar: 1. A superclasse está sendo usada somente para prover código comum às subclasses evitando assim a duplicação de código. Nesse caso, sim, métodos que são sobrescritos em todas as subclasses podem ser removidos da superclasse. 2. O objetivo da superclasse é fornecer uma interface comum de modo que as classes da hierarquia possam ser usadas de modo polimórfico. Nesse caso, se você tirar o método da superclasse ele não pode mais ser invocado polimorficamente (ainda que ele esteja presente nas subclasses). Nesse caso, qual deve ser a implementação do método na superclasse? 15
Métodos abstratos Existem casos em que nenhuma implementação faz sentido para um método na superclasse uma vez que todas as subclasses reescrevem o método. Nesses casos, podemos transformar o método na superclasse em um método abstrato. Repare, métodos abstratos não têm implementação. Nem mesmo um abre e fecha chaves. 16
Métodos abstratos Classes contendo métodos abstratos têm, obrigatoriamente, de ser declaradas como abstratas. (Discussão em sala de aula: por que?) As classes que estendem uma classe abstrata têm de, necessariamente, implementar todos os seus métodos abstratos (discussão em sala de aula: ou permanecerem elas também abstratas) 17
Métodos abstratos Como a classe ControleDeBonificacoes pode invocar o método getbonificacao() de Funcionario, se a classe Funcionario não tem uma implementação desse método? O método registra não recebe instâncias de Funcionario (como podemos ter certeza disso???) mas sim instâncias de Diretor, Gerente, etc. que têm implementações desse método (como podemos ter certeza disso???) 18
Aumentando o exemplo Observe a hierarquia a seguir. Ela vai compilar? Vai rodar? Que implementação de getbonificacao() será usada por uma instância de Diretor? 19
Aumentando o exemplo Observe a hierarquia a seguir. Ela vai compilar? Vai rodar? A classe Secretaria estende Funcionario mas não implementa o método getbonificacao(). Isto está certo? 20