1 / 40

Paulo Borba Centro de Informática Universidade Federal de Pernambuco

Herança, subtipos, polimorfismo e dynamic binding. Paulo Borba Centro de Informática Universidade Federal de Pernambuco. Crédito. Objeto Poupança. Saldo. Número. R. Juros. 875,32. 21.342-7. Débito. Crédito. Crédito. Saldo. Número. R. Juros. R. Juros. 895,32. 21.342-7. Débito.

seth-barr
Download Presentation

Paulo Borba Centro de Informática Universidade Federal de Pernambuco

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Herança, subtipos, polimorfismo e dynamic binding Paulo Borba Centro de Informática Universidade Federal de Pernambuco

  2. Crédito Objeto Poupança Saldo Número R. Juros 875,32 21.342-7 Débito

  3. Crédito Crédito Saldo Número R. Juros R. Juros 895,32 21.342-7 Débito Estados do Objeto Poupança Crédito(20) Crédito Saldo Número Saldo Número 875,32 21.342-7 875,32 21.342-7 Débito Débito

  4. Crédito Crédito Saldo Número R. Juros R. Juros 884,07 21.342-7 Débito Estados do Objeto Poupança R. Juros(0.01) Crédito Saldo Número Saldo Número 875,32 21.342-7 875,32 21.342-7 Débito Débito

  5. Classe de Poupanças: Assinatura public class PoupancaD { public PoupancaD (String n) {} public void creditar (double valor) {} public void debitar (double valor) {} public String getNumero() {} public double getSaldo() {} public void renderJuros(double taxa) {} }

  6. Classe de Poupanças: Descrição public class PoupancaD { private Stringnumero; private double saldo; publicvoid creditar (double valor) { saldo = saldo + valor; } //... public void renderJuros(double taxa) { this.creditar(saldo * taxa); } }

  7. Classe de Bancos: Assinatura public class BancoD { public BancoD () {} public void cadastrarConta(Conta c) {} publicvoid cadastrarPoupanca(PoupancaD p) {} publicvoid creditarConta(String numero, double valor) {} publicvoid creditarPoupanca(String numero, double valor) {} // ... }

  8. Classe de Bancos: Descrição public class BancoD { private Conta[] contas; private PoupancaD[] poupancas; private int indiceP, indiceC;

  9. public void cadastrarConta(Conta c) { contas[indiceC] = c; indiceC = indiceC + 1; } public void cadastrarPoupanca(PoupancaD p) { poupancas[indiceP] = p; indiceP = indiceP + 1; }

  10. privateConta procurarConta(String numero) { int i = 0; boolean achou = false; Conta resposta = null; while ((! achou) && (i < indiceC)) { if (contas[i].getNumero().equals(numero)) achou = true; else i = i + 1; } if (achou) resposta = contas[i]; return resposta; }

  11. public void debitarConta(String numero, double valor) { Conta c; c = this.procurarConta(numero); if (c != null) c.debitar(valor); else System.out.println("Conta inexistente!"); }

  12. Problemas • Duplicação desnecessária de código: • A definição de PoupançaD é uma simples extensão da definição de Conta • Clientes de Conta que precisam trabalhar também com PoupançaD terão que ter código especial para manipular poupanças • Falta refletir relação entre tipos do “mundo real”

  13. Subtipos e Subclasses Poupança Conta

  14. Herança • Necessidade de estender classes • alterar classes já existentes e adicionar propriedades ou comportamentos para representar outra classe de objetos • criar uma hierarquia de classes que “herdam” propriedades e comportamentos de outra classe e definem novas propriedades e comportamentos

  15. Subclasses • Comportamento objetos da subclasse comportam-se como os objetos da superclasse • Substituição objetos da subclasse podem ser usados no lugar de objetos da superclasse

  16. Herança • Reuso de Código a descrição da superclasse pode ser usada para definir a subclasse • Extensibilidade algumas operações da superclasse podem ser redefinidas na subclasse

  17. Classe de Poupanças: Assinatura public class Poupanca extends Conta { public Poupanca (String numero) {} publicvoid renderJuros(double taxa) {} }

  18. Classe de Poupanças: Descrição public class Poupanca extends Conta { public Poupanca (String numero) { super (numero); } public void renderJuros(double taxa) { this.creditar(this.getSaldo() * taxa); } }

  19. Extends • subclasseextendssuperclasse • Mecanismo para definição de herança e subtipos • Herança simples: só pode-se herdar uma classe por vez

  20. Extends: Restrições • Atributos e métodos privados são herdados, mas não podem ser acessados diretamente • Qualificador protected: visibilidade restrita ao pacote e as subclasses de outros pacotes • Construtores não são herdados • Construtor default só é disponível se também for disponível na superclasse

  21. Usando Poupanças ... Poupanca poupanca; poupanca = new Poupanca(“21.342-7”); poupanca.creditar(500.87); poupanca.debitar(45.00); System.out.println(poupanca.getSaldo()); ...

  22. Subtipos: Substituição ... Conta conta; conta = new Poupanca(“21.342-7”); conta.creditar(500.87); conta.debitar(45.00); System.out.println(conta.getSaldo()); ...

  23. Herança • Polimorfismo • Uma conta pode ser • uma poupança • uma conta especial • Um transporte pode ser • um carro • um avião • um barco

  24. Subtipos: Verificação Dinâmica com Casts ... Conta conta; conta = new Poupanca("21.342-7"); ... conta.renderJuros(0.01); conta.imprimirSaldo(); ... ((Poupanca) conta).renderJuros(0.01);

  25. Substituição e Casts • Nos contextos onde contas são usadas pode-se usar poupanças • Nos contextos onde poupanças são usadas pode-se usar contas com o uso explícito de casts • Casts correspondema verificação dinâmica de tipos e podem gerar exceções (Cuidado!) • Casts não fazem conversão de tipos

  26. Classe Banco: Assinatura public class Banco { public Banco () {} publicvoid cadastrar(Conta conta) {} public void creditar(String numero, double valor) {} public void debitar(String numero, double valor) {} public double getSaldo(String numero) {} public void transferir(String contaOrigem, String contaDestino, double valor) {} }

  27. Subtipos: Substituição ... Banco banco = new Banco(); banco.cadastrar(new Conta("21.345-7")); banco.cadastrar(new Poupanca("1.21.345-9")); banco.creditar("21.345-7",129.34); banco.transferir("21.345-7","1.21.345-9",9.34); System.out.print(banco.getSaldo("1.21.345-9")); ...

  28. Exercício • Modifique a classe Banco para que seja possível render juros de uma poupança. Isto é, adicione um novo método que rende os juros da poupança cujo número é parâmetro deste método; a taxa de juros corrente deve ser um atributo de Banco.

  29. Subtipos: Verificação Dinâmica com instanceof ... Conta c = this.procurar("123.45-8"); if (c instanceof Poupanca) ((Poupanca) c).renderJuros(0.01); else System.out.print("Poupança inexistente!") ...

  30. Verificação Dinâmica de Tipos • Casts e instanceof: • ((Tipo) variável) • variávelinstanceof Tipo • O tipo de variável deve ser supertipo de Tipo • Casts geram exceções quando instanceof retorna false • Casts são essenciais para verificação estática de tipos (compilação)

  31. Crédito Objeto Conta Especial Saldo Número Bônus R. Bônus 875,32 21.342-7 11,60 Débito

  32. Crédito R. Bônus R. Bônus Estados de uma Conta Especial Crédito(20) Crédito Crédito Saldo Número Bônus Saldo Número Bônus Saldo Número 875,32 21.342-7 11,60 895,32 21.342-7 11,80 875,32 21.342-7 Débito Débito Débito

  33. Crédito R. Bônus R. Bônus Estados de uma Conta Especial R. Bônus() Crédito Crédito Saldo Número Bônus Saldo Número Bônus Saldo Número 875,32 21.342-7 11,80 887,12 21.342-7 0,00 875,32 21.342-7 Débito Débito Débito

  34. Contas Especiais: Assinatura public class ContaEspecial extends Conta { public ContaEspecial (String numero) {} public void renderBonus() {} publicdouble getBonus() {} publicvoid creditar(double valor) {} }

  35. Contas Especiais: Descrição public class ContaEspecial extends Conta { private double bonus; public ContaEspecial (String numero) { super (numero); bonus = 0.0; }

  36. publicvoid creditar(double valor) { bonus = bonus + (valor * 0.01); super.creditar(valor); } public void renderBonus() { super.creditar(bonus); bonus = 0; } public double getBonus() { return bonus; }

  37. Redefinição de Métodos • Invariância: tipos dos argumentos e resultados da redefinição tem que ser iguais aos tipos da definição • Semântica e Visibilidade dos métodos redefinidos deve ser preservada • Só é possível acessar a definição dos métodos da superclasse imediata (via super)

  38. Usando Contas Especiais ... ContaEspecial contae; contae = new ContaEspecial("21.342-7"); contae.creditar(200.00); contae.debitar(100.00); contae.renderBonus(); System.out.print(contae.getSaldo()); ...

  39. Ligações Dinâmicas ... Conta conta; conta = new ContaEspecial("21.342-7"); conta.creditar(200.00); conta.debitar(100.00); ((ContaEspecial) conta).renderBonus(); System.out.print(conta.getSaldo()); ...

  40. Ligações Dinâmicas • Dois métodos com o mesmo nome e tipo: definição e redefinição, qual usar? • O código é escolhido dinamicamente (em tempo de execução), não estaticamente (em tempo de compilação) • Escolha é feita com base na classe do objeto associado à variável destino do método

More Related