Paulo Borba Centro de Informática Universidade Federal de Pernambuco
description
Transcript of Paulo Borba Centro de Informática Universidade Federal de Pernambuco
![Page 1: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/1.jpg)
Paulo BorbaCentro de Informática
Universidade Federal de Pernambuco
Herança, subtipos, polimorfismoe dynamic binding
![Page 2: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/2.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Objeto Poupança
R. Juros
![Page 3: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/3.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados do Objeto Poupança
Número Saldo
21.342-7 895,32
Crédito
Débito
Número Saldo
21.342-7 875,32
Crédito
Débito
Crédito(20)
R. Juros R. Juros
![Page 4: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/4.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados do Objeto Poupança
Número Saldo
21.342-7 884,07
Crédito
Débito
Número Saldo
21.342-7 875,32
Crédito
Débito
R. Juros(0.01)
R. Juros R. Juros
![Page 5: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/5.jpg)
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) {}}
![Page 6: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/6.jpg)
Classe de Poupanças: Descrição
public class PoupancaD { private String numero; private double saldo; public void creditar (double valor) { saldo = saldo + valor; } // ... public void renderJuros(double taxa) { this.creditar(saldo * taxa); }}
![Page 7: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/7.jpg)
Classe de Bancos: Assinatura
public class BancoD { public BancoD () {} public void cadastrarConta(Conta c) {} public void cadastrarPoupanca(PoupancaD p) {} public void creditarConta(String numero, double valor) {} public void creditarPoupanca(String numero, double valor) {} // ...}
![Page 8: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/8.jpg)
Classe de Bancos: Descrição
public class BancoD { private Conta[] contas; private PoupancaD[] poupancas; private int indiceP, indiceC;
![Page 9: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/9.jpg)
public void cadastrarConta(Conta c) { contas[indiceC] = c; indiceC = indiceC + 1; }
public void cadastrarPoupanca(PoupancaD p) { poupancas[indiceP] = p; indiceP = indiceP + 1; }
![Page 10: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/10.jpg)
private Conta 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;}
![Page 11: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/11.jpg)
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!");}
![Page 12: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/12.jpg)
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”
![Page 13: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/13.jpg)
Subtipos e Subclasses
Poupança
Conta
![Page 14: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/14.jpg)
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
![Page 15: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/15.jpg)
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
![Page 16: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/16.jpg)
Herança
Reuso de Códigoa descrição da superclasse pode ser
usada para definir a subclasse Extensibilidadealgumas operações da superclasse podem ser redefinidas na subclasse
![Page 17: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/17.jpg)
Classe de Poupanças: Assinatura
public class Poupanca extends Conta { public Poupanca (String numero) {} public void renderJuros(double taxa) {}}
![Page 18: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/18.jpg)
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); }}
![Page 19: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/19.jpg)
Extends
subclasse extends superclasse Mecanismo para definição de
herança e subtipos Herança simples: só pode-se
herdar uma classe por vez
![Page 20: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/20.jpg)
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
![Page 21: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/21.jpg)
Usando Poupanças
...Poupanca poupanca;poupanca = new Poupanca(“21.342-7”);poupanca.creditar(500.87);poupanca.debitar(45.00);System.out.println(poupanca.getSaldo());...
![Page 22: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/22.jpg)
Subtipos: Substituição
...Conta conta;conta = new Poupanca(“21.342-7”);conta.creditar(500.87);conta.debitar(45.00);System.out.println(conta.getSaldo());...
![Page 23: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/23.jpg)
Herança
Polimorfismo• Uma conta pode ser
—uma poupança—uma conta especial
• Um transporte pode ser —um carro—um avião—um barco
![Page 24: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/24.jpg)
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);
![Page 25: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/25.jpg)
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 correspondem a verificação dinâmica de tipos e podem gerar exceções (Cuidado!)
Casts não fazem conversão de tipos
![Page 26: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/26.jpg)
Classe Banco: Assinatura
public class Banco { public Banco () {} public void 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) {} }
![Page 27: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/27.jpg)
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"));...
![Page 28: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/28.jpg)
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.
![Page 29: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/29.jpg)
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!")...
![Page 30: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/30.jpg)
Verificação Dinâmica de Tipos Casts e instanceof:
• ((Tipo) variável) • variável instanceof 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)
![Page 31: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/31.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Objeto Conta Especial
R. Bônus
Bônus
11,60
![Page 32: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/32.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados de uma Conta Especial
Número Bônus Saldo
21.342-7 11,80 895,32
Crédito
Débito
Número Bônus Saldo
21.342-7 11,60 875,32
Crédito
Débito
Crédito(20)
R. Bônus R. Bônus
![Page 33: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/33.jpg)
Número Saldo
21.342-7 875,32
Crédito
Débito
Estados de uma Conta Especial
Número Bônus Saldo
21.342-7 0,00 887,12
Crédito
Débito
Número Bônus Saldo
21.342-7 11,80 875,32
Crédito
Débito
R. Bônus()
R. Bônus R. Bônus
![Page 34: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/34.jpg)
Contas Especiais: Assinatura
public class ContaEspecial extends Conta { public ContaEspecial (String numero) {} public void renderBonus() {} public double getBonus() {} public void creditar(double valor) {} }
![Page 35: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/35.jpg)
Contas Especiais: Descrição
public class ContaEspecial extends Conta {
private double bonus;
public ContaEspecial (String numero) { super (numero); bonus = 0.0; }
![Page 36: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/36.jpg)
public void creditar(double valor) { bonus = bonus + (valor * 0.01); super.creditar(valor);}public void renderBonus() { super.creditar(bonus); bonus = 0;}public double getBonus() { return bonus;}
![Page 37: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/37.jpg)
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)
![Page 38: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/38.jpg)
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());...
![Page 39: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/39.jpg)
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());...
![Page 40: Paulo Borba Centro de Informática Universidade Federal de Pernambuco](https://reader031.fdocumentos.com/reader031/viewer/2022013004/56813351550346895d9a5d1c/html5/thumbnails/40.jpg)
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