Upload
internet
View
114
Download
0
Embed Size (px)
Citation preview
LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS
CLASSES ABSTRATAS
Prof. Thiago Pereira Rique
http://thiagorique.wordpress.com/
AGENDA
Classes abstratas Métodos abstratos
CLASSES ABSTRATAS
Vamos recordar um possível estado da classe Funcionario
CLASSES ABSTRATAS
Considere agora a classe ControleDeBonificacoes
CLASSES ABSTRATAS
O método registra recebe qualquer referência do tipo Funcionario. Funcionario ou seus subtipos (Gerente, Diretor,
etc.). Estamos utilizando a classe Funcionario para o
polimorfismo. Em alguns sistemas (como é o nosso caso),
usamos uma classe com o objetivo de economizar código e ganhar polimorfismos para criar métodos genéricos.
“Faz sentido ter um objeto do tipo Funcionario?” X “Faz sentido ter uma referência do tipo Funcionario?”
CLASSES ABSTRATAS
Polimorfismo de referência Utilizar new em Funcionario pode não fazer
sentido. Queremos algo mais concreto que Funcionario.
CLASSES ABSTRATAS
Outro caso: Classe Pessoa
Classe PessoaFisica Classe PessoaJuridica
A classe Pessoa estaria sendo usada apenas para ganhar o polimorfismo. Não faz sentido permitir instanciá-la.
Solução para este problema? Classes abstratas!!!
CLASSES ABSTRATAS
Suponha que nossa empresa tenha apenas gerentes, diretores, secretárias, etc.
O que vem a ser exatamente nossa classe Funcionario? Idealização de um tipo (um rascunho)
Para nosso sistema, é inadmissível que um objeto seja apenas do tipo Funcionario.
Palavra-chave abstract Impede a classe Funcionario de ser instanciada.
CLASSES ABSTRATAS
Classe abstrata Funcionario.
CLASSES ABSTRATAS
Considere o código:
O problema é instanciar a classe. Criar referência é permitido.
CLASSES ABSTRATAS
Podemos então herdar da classe Funcionario, reescrevendo o método getBonificacao.
OBS.: “Fique claro que a decisão de transformar Funcionario em uma classe abstrata dependeu do nosso domínio!”
MÉTODOS ABSTRATOS
Se getBonificacao não fosse reescrito, seria herdado da classe mãe. Retornaria o salário + 20%
Não existe uma regra para a bonificação de funcionários.
Poderíamos então jogar fora o método getBonificacao da classe Funcionario? Funcionario f f.getBonificacao(); //não poderíamos fazer isto
Em uma classe abstrata, podemos determinar que um método será sempre escrito pelas classes filhas.
MÉTODOS ABSTRATOS
Um método abstrato indica que todas as subclasses (classes filhas, concretas) devem reescrever o método.
MÉTODOS ABSTRATOS
Voltando ao método registra na classe ControleDeBonificacoes.
MÉTODOS ABSTRATOS
Voltando ao método registra na classe ControleDeBonificacoes. A chamada f.getBonificacao() não vai falhar! O método é abstrato, logo suas subclasses
reescrevem o método (concreto).
REFERÊNCIA
Apostila caelum-java-objetos-fj11 http://www.caelum.com.br/apostilas/