HERANÇA E POLIMORFISMO Prof. Thiago Pereira Rique <[email protected]> http://thiagorique.wordpress.com/ AGENDA Herança Reescrita de método (overriding) Invocando o método reescrito Polimorfismo HERANÇA Vamos modelar a classe funcionário de um banco. HERANÇA Em um banco, há também um gerente. Um gerente guarda as mesmas informações de um funcionário comum. Um gerente possui informações e funcionalidades um pouco diferentes. HERANÇA A classe gerente HERANÇA Precisamos mesmo de outra classe? Se um dia precisarmos adicionar uma nova informação para todos os funcionários, precisaremos passar por todas as classes de funcionário e adicionar este atributo. Em Java, podemos relacionar duas classes de modo que uma herda características que a outra possui. Classe mãe (superclasse) e classe filha (subclasse) No nosso caso, gostaríamos que gerente tivesse o que funcionário tem (gerente seria uma extensão de funcionário) HERANÇA Herança Classes de objetos novas são derivadas absorvendo-se características de classes existentes e adicionando-se características únicas dessas mesmas classes. HERANÇA Classe Gerente estende Funcionario. HERANÇA Um Gerente é um Funcionario. HERANÇA Classe de teste. HERANÇA A subclasse herda todos os membros (atributos e métodos) da superclasse. Membros private não podem ser acessados diretamente pela subclasse. E se precisarmos acessar os atributos que herdamos? Modificador de acesso protected Visível pela classe, subclasses e classes no mesmo pacote. HERANÇA Modificador de acesso protected HERANÇA Herança simples do Java REESCRITA DE MÉTODO (OVERRIDING) Considere a situação No fim do ano, os funcionários do banco recebem uma bonificação. Funcionários comuns recebem 10% do salário e gerentes, 15%. REESCRITA DE MÉTODO (OVERRIDING) A classe Gerente getBonificacao. vai herdar o método O resultado será 500, quando deveria ser 750 (trata-se de um gerente). REESCRITA DE MÉTODO (OVERRIDING) Em Java, podemos alterar o comportamento de um método herdado. Podemos reescrever (sobrescrever, override) este método. INVOCANDO O MÉTODO REESCRITO Após reescrito, não podemos mais chamar o método herdado da superclasse, mas podemos invocá-lo se estivermos dentro da classe. Palavra reservada super Considere a seguinte situação: Suponha que para calcular a bonificação de um Gerente fazemos o mesmo cálculo de um Funcionario, acrescentando R$ 1000. INVOCANDO O MÉTODO REESCRITO Poderíamos fazer o seguinte: Qual o problema com esta abordagem? INVOCANDO O MÉTODO REESCRITO Se o getBonificacao de Funcionario mudar, teremos que modificar o getBonificacao de Gerente. Solução O getBonificacao de Gerente getBonificacao de Funcionario. Palavra reservada super pode chamar o INVOCANDO O MÉTODO REESCRITO Solução POLIMORFISMO O que guarda uma variável do tipo Funcionario? Uma referência, nunca um objeto em si. POLIMORFISMO Conceito Polimorfismo é a capacidade de um objeto poder ser referenciado de várias formas. ATENÇÃO: isto não significa que o objeto se transforma em outro tipo. E se tentássemos funcionario.getBonificacao(); ? Qual seria o retorno? 500 ou 750? POLIMORFISMO Apesar de estarmos nos referindo ao objeto como um Funcionario, o método invocado será o do Gerente, pois o objeto é do tipo Gerente. Logo, o valor retornado será 750. Para que criar um Gerente e referenciá-lo como um Funcionario? Situação mais comum Método que Funcionario. recebe um argumento do tipo POLIMORFISMO Método que recebe um argumento do tipo Funcionario. POLIMORFISMO Em algum lugar da aplicação (ou no main): POLIMORFISMO No método registra da classe ControleDeBonificacoes, o método getBonificacao do argumento é chamado. Quando o argumento se tratar de um Gerente, o método invocado será o reescrito, isto é, será invocado o método getBonificacao do Gerente. Reafirmando: Não importa como nos referenciamos a um objeto, o método que será invocado é sempre o que é dele. REFERÊNCIA Apostila caelum-java-objetos-fj11 http://www.caelum.com.br/apostilas/