A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

POO Herança e Polimorfismo

Apresentações semelhantes


Apresentação em tema: "POO Herança e Polimorfismo"— Transcrição da apresentação:

1 POO Herança e Polimorfismo
Prof. Eduardo Falcão

2 Composição, agregação, associação Herança Reescrita Sobrecarga
"O homem absurdo é aquele que nunca muda.“ - Georges Clemenceau Composição, agregação, associação Herança Reescrita Sobrecarga Polimorfismo

3 Composição, Agregação e Associação
Um trem é formado por 1 locomotiva e n vagões; Relacionamento tem-um; Agregação Uma locomotiva (todo) tem um farol (parte), mas não deixa de existir se não o tiver; Associação Um trem usa uma estrada de ferro (a estrada não faz parte do trem, mas ele depende dela). Composição: quando algum objeto é formado pela COMPOSIÇÃO, ou seja, pela existência conjunta de outros objetos. Logo, se um desses objetos deixar de existir, o todo deixa de existir. Agregação: como o próprio nome diz, é quando algum objeto (parte) agrega valor a um outro objeto (todo), de modo que o objeto “parte” esteja contido num “todo”. Se essa parte deixa de existir, o todo não deixa de existir (apesar de poder ser afetado), já que ela apenas AGREGA (que significa soma) valor ao todo. Associação: relação de dependência (o trem não deixa de existir sem a estrada de ferro, mas também não pode funcionar)

4 Herança Objetivo 1: reuso de código. Praticando! (5 minutos)
Imagine o sistema de um banco... Nesse sistema precisamos armazenar dados de funcionários (que podem exercer diferentes funções, ex.: secretário ou gerente) e clientes. Vamos modelar essa parte do sistema! 

5 Herança Relacionamento É-UM  em java, instanceof
A seta representa uma generalização, ou seja, extends (da herança). Como é que a gente testa o relacionamento É-UM? (instanceof)

6 A seta representa uma generalização, ou seja, extends (da herança).
Como é que a gente testa o relacionamento É-UM? (instanceof)

7 Herança Objetivos: Palavras-chave: Reuso de código; Polimorfismo.
extends: para herdar as caraterísticas de uma classe; Instanceof: para testar relacionamentos É-UM entre objetos

8 Quais seriam as implicações dessa nova abordagem?
Se não houvesse herança em Java, como você poderia reaproveitar o código de outra classe? Quais seriam as implicações dessa nova abordagem? Resposta: composição.

9 Overriding Outros nomes: sobrescrever (overwriting), reescrever, sobrepor... Praticando! (5 minutos) No exemplo anterior, suponha que os funcionários, de modo geral, ganhem uma bonificação de 10%. Mas, devido o fato do gerente ter mais responsabilidade, seria justo que ele ganhasse uma bonificação de 20% de seu salário. Como nós alteraríamos o nosso modelo para satisfazer essa nova especificação? (modele/implemente apenas as classes Funcionário e Gerente)

10 Overriding public double getBonificacao(){ return 0.1*this.salario; }

11 Overriding Objetivo: especializar um método herdado.
Regras para sobrescrever um método: A assinatura deve ser igual ou bem similar: Lista de argumentos exatamente igual; Tipo de retorno deve ser “igual” (lembrar da relação É-UM, pois subtipos também são aceitos); Modificador de acesso pode ser menos restritivo; Para haver reescrita deve, primeiramente, haver herança. Mais regras em: Livro de Certificação Java SCJP Sun Certified Programmer for Java 6 OCP Java SE 6 Programmer Métodos sobrepostos nunca podem ter menos acesso que os métodos originais. ƒSe método original for public, novas versões têm que ser public. ƒSe método original for protected, novas versões podem ser protected ou public . Se método original não tiver modificador de acesso (é "package-private"), novas versões podem ser declaradas sem modificador de acesso, com modificador protected ou public. ƒSe método original for private, ele não será visível da subclasse e portanto, jamais poderá ser herdado e reescrito.

12 Overloading Outro nome: sobrecarregar, ...

13 Overloading Objetivo: prover ao usuário a possibilidade de executar uma funcionalidade do sistema passando diferentes inputs (tipos de dados) É basicamente uma outra implementação de um método já existente mas com argumentos diferentes. Regras para sobrecarregar um método... Os métodos sobrecarregados devem alterar a lista de argumentos; Os métodos sobrecarregados podem alterar o tipo de retorno; Os métodos sobrecarregados podem alterar o modificador de acesso; Um método pode ser sobrecarregado na mesma classe ou em uma subclasse. Também é possível sobrecarregar um construtor. Mais regras em: Livro de Certificação Java SCJP Sun Certified Programmer for Java 6 OCP Java SE 6 Programmer

14 numFuncionariosGerenciados
Polimorfismo Polivárias morfoformas O que guarda uma variável do tipo Funcionário? Uma referência para um funcionário...  Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); O que guarda uma variável do tipo Funcionario? Uma referência para um Funcionario, nunca o objeto em si. Na herança, vimos que todo Gerente é um Funcionario, pois é uma extensão deste. Podemos nos referir a um Gerente como sendo um Funcionario. Se alguém precisa falar com um Funcionario do banco, pode falar com um Gerente! Porque? Pois Gerente é um Funcionario. Essa é a semântica da herança. Semântica da palavra poli(várias) morfo(formas) Polimorfismo é a capacidade de um objeto poder ser referenciado de várias formas. (cuidado, polimorfismo não quer dizer que o objeto fica se transformando, muito pelo contrário, um objeto nasce de um tipo e morre daquele tipo, o que pode mudar é a maneira como nos referimos a ele). Gerente get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenciados getBonificacao() Autentica() Gerente g Funcionario f

15 numFuncionariosGerenciados
Polimorfismo O que guarda uma variável do tipo Funcionário? Uma referência para um funcionário. Gerente g = new Gerente(); Funcionario f = g; f.setSalario(1000); System.out.println(f.getBonificacao()); Até aqui tudo bem, mas e se eu tentar: f.getBonificacao(); Qual é o retorno desse método? 100 ou 200? No Java, a invocação de método sempre vai ser decidida em tempo de execução. O Java vai procurar o objeto na memória e, aí sim, decidir qual método deve ser chamado, sempre relacionando com sua classe de verdade, e não com a que estamos usando para referenciá-lo. Apesar de estarmos nos referenciando a esse Gerente como sendo um Funcionário, o método executado é o do Gerente. O retorno é 200. Decidido em tempo de execução Gerente get/setNome() get/setIdade() get/setSalario() Senha numFuncionariosGerenciados getBonificacao() Autentica() Gerente g Funcionario f

16 Polimorfismo Por que polimorfismo? class ControleDeBonificacoes {
private double totalDeBonificacoes = 0; public void registra(Funcionario funcionario) { this.totalDeBonificacoes += funcionario.getBonificacao(); } public double getTotalDeBonificacoes() { return this.totalDeBonificacoes;

17 Polimorfismo Por que polimorfismo?
O que acontece se futuramente precisarmos criar outros tipos de funcionários? ControleDeBonificacoes controle = new ControleDeBonificacoes(); Gerente funcionario1 = new Gerente(); funcionario1.setSalario(1000); controle.registra(funcionario1); Funcionario funcionario2 = new Funcionario(); funcionario2.setSalario(1000); controle.registra(funcionario2); System.out.println(controle.getTotalDeBonificacoes()); Repare que conseguimos passar um Gerente para um método que recebe umFuncionario como argumento. Pense como numa porta na agência bancária com o seguinte aviso: "Permitida a entrada apenas de Funcionários". Um gerente pode passar nessa porta? Sim, pois Gerente é um Funcionario. Qual será o valor resultante? Não importa que dentro do método registra do ControleDeBonificacoes receba Funcionario. Quando ele receber um objeto que realmente é um Gerente, o seu método reescrito será invocado. Reafirmando: não importa como nos referenciamos a um objeto, o método que será invocado é sempre o do objeto em questão. No dia em que criarmos uma classe Secretaria, por exemplo, que é filha de Funcionario, precisaremos mudar a classe de ControleDeBonificacoes? Não. Basta a classe Secretaria reescrever os métodos que lhe parecerem necessários. É exatamente esse o poder do polimorfismo, juntamente com a reescrita de método: diminuir o acoplamento entre as classes, para evitar que novos códigos resultem em modificações em inúmeros lugares. Repare que quem criou ControleDeBonificacoes pode nunca ter imaginado a criação da classe Secretaria ou Engenheiro. Contudo, não será necessário reimplementar esse controle em cada nova classe: reaproveitamos aquele código.

18 Polimorfismo Dicas sobre polimorfismo:
Não importa como nos referenciamos a um objeto, o método que será invocado é sempre o do objeto em questão. Programe sempre pra uma superclasse! Repare que conseguimos passar um Gerente para um método que recebe umFuncionario como argumento. Pense como numa porta na agência bancária com o seguinte aviso: "Permitida a entrada apenas de Funcionários". Um gerente pode passar nessa porta? Sim, pois Gerente é um Funcionario. Qual será o valor resultante? Não importa que dentro do método registra do ControleDeBonificacoes receba Funcionario. Quando ele receber um objeto que realmente é um Gerente, o seu método reescrito será invocado. Reafirmando: não importa como nos referenciamos a um objeto, o método que será invocado é sempre o do objeto em questão. No dia em que criarmos uma classe Secretaria, por exemplo, que é filha de Funcionario, precisaremos mudar a classe de ControleDeBonificacoes? Não. Basta a classe Secretaria reescrever os métodos que lhe parecerem necessários. É exatamente esse o poder do polimorfismo, juntamente com a reescrita de método: diminuir o acoplamento entre as classes, para evitar que novos códigos resultem em modificações em inúmeros lugares. Repare que quem criou ControleDeBonificacoes pode nunca ter imaginado a criação da classe Secretaria ou Engenheiro. Contudo, não será necessário reimplementar esse controle em cada nova classe: reaproveitamos aquele código.

19 Polimorfismo Implemente o seguinte modelo: (5 minutos)
System.out.println("Cachorro correndo...");   System.out.println("AU AU AU!");   System.out.println("Cavalo correndo...");   System.out.println("IRRRIINN");   System.out.println("Preguica subindo em arvores...");   System.out.println("AAAAAAHHHHZZZZ"); 

20 Polimorfismo Crie uma classe Zoologico composta por 5 jaulas (array), onde cada uma terá um animal diferente. Depois percorra cada jaula e “cutuque o animal” (emitirSom) e, se o animal souber correr, dê uma carreira nele (correr). (7 minutos)  animal.emitirSom(); if(animal instanceof Cachorro){ Cachorro c = (Cachorro) animal; //faz o casting c.correr(); } else if(animal instanceof Cavalo) { Cavalo c = (Cavalo) animal; //faz o casting

21 Referências Essa aula utilizou alguns exemplos modificados das apostilas caelum além de alguns conceitos e exemplos abordados na apostilas para certificação java (SCJP e OCJP). Ahhh, alguns destes exemplos também saíram da minha cabeça. 


Carregar ppt "POO Herança e Polimorfismo"

Apresentações semelhantes


Anúncios Google