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

 

Subtipos e Subclasses

 

Subclasses

 

Herança

 

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

 

Extends: Restrições

 

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

 

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


Sérgio Soares(scbs@di.ufpe.br)