Herança e Subtipos
Programação 3: Orientação a Objetos e Java
Objeto Poupança
Estados do Objeto Poupança
Classe de Poupanças: Assinatura
class PoupancaD {
void credito (double valor) {}
void debito (double valor) {}
String numero() {}
double saldo() {}
PoupancaD (String n) {}
void rende_juros(double t) {}
}
Classe de Poupanças: Descrição
class PoupancaD {
private String numero;
private double saldo;
void credito (double valor) {saldo = saldo + valor;}
String numero() {return numero;}
...
void rende_juros(double t) {this.credito(saldo * t);}
}
Classe de Bancos: Assinatura
class BancoD {
void cadastro_conta(Conta c) {}
void cadastro_poupanca(PoupancaD p) {}
void credito_conta(String num, double val) {}
void credito_poupanca(String num, double val) {}
...
BancoD () {}
}
Classe de Bancos: Descrição
class BancoD {
private Conta[] contas;
private PoupancaD[] poupancas;
private int indicep, indicec = 0;
void cadastro_conta(Conta c) {
contas[indicec] = c;
indicec = indicec + 1;
}
void cadastro_poupanca(PoupancaD p) {
contas[indicep] = p;
indicep = indicep + 1;
}
private Conta procura_conta(String n) {
int i = 0;
boolean achou = false;
while ((! achou) && (i < indicec)) {
if (contas[i].numero() == n) achou = true;
else i = i + 1;
}
if (achou == true) return contas[i];
else return null;
}
void debito_conta(String num, double val) {
Conta c;
c = this.procura_conta(num);
if (c != null) c.debito(val);
else System.out.println("Conta inexistente!");
}
}
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
Subtipos e Subclasses
Subclasses
Comportamento
objetos da subclasse comportam-se como os objetos da superclasse
Substituição
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
Classe de Poupanças: Assinatura
class Poupanca extends Conta {
void rende_juros(double t) {}
Poupanca (String num) {}
}
Classe de Poupanças: Descrição
class Poupanca extends Conta {
void rende_juros(double t) {
this.credito(this.saldo() * t);
}
Poupanca (String num) { super (num);}
}
Extends
subclasse extends superclasse
Mecanismo para definição de herança e subtipos
Extends: Restrições
Atributos e métodos privados são herdados, mas não podem ser acessados diretamente
Qualificador protected: visibilidade restrita a classe e subclasses
Construtores não são herdados
Usando Poupanças
...
Poupanca poup;
poup = new Poupanca(¨21.342-7¨);
poup.credito(500.87);
poup.debito(45.00);
System.out.println(poup.saldo());
...
Subtipos: Substituição
...
Conta conta;
conta = new Poupanca(¨21.342-7¨);
conta.credito(500.87);
conta.debito(45.00);
System.out.println(conta.saldo());
...
Subtipos: Verificação Dinâmica com Casts
...
Conta conta;
conta = new Poupanca(¨21.342-7¨);
...
((Poupanca) conta).rende_juros(0.01);
conta.imprime_saldo();
...
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!)
Classe de Bancos: Assinatura
class Banco {
void cadastro(Conta c) {}
void credito(String num, double val) {}
void debito(String num, double val) {}
double saldo(String num) {}
void transfere(String d, String p, double v) {}
Banco () {}
}
Subtipos: Substituição
...
Banco banco = new Banco();
banco.cadastro(new Conta(¨21.345-7¨));
banco.cadastro(new Poupanca(¨1.21.345-9¨));
banco.credito(¨21.345-7¨,129.34);
banco.transfere(¨21.345-7¨,¨1.21.345-9¨,9.34);
System.out.print(banco.saldo(¨1.21.345-9¨));
...
Subtipos: Verificação Dinâmica com instanceof
...
Conta c = this.procura(¨123.45-8¨);
if (c instanceof Poupanca)
((Poupanca) c).rende_juros(0.01);
else System.out.print(¨Poupança inexistente!¨)
...
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, instanceof retorna false
Sérgio Soares(scbs@di.ufpe.br) |