Classes Abstratas
Programação 3: Orientação a Objetos e Java
Objeto Conta Imposto
Estados do Objeto Conta Imposto
Estados do Objeto Conta
Conta Imposto: Assinatura
class ContaImposto {
void credito (double valor) {}
void debito (double valor) {}
String numero() {}
double saldo() {}
ContaImposto (String n) {}
}
Conta Imposto: Assinatura
class ContaImpostoM extends Conta {
ContaImpostoM (String num) {}
}
Conta Imposto: Descrição
class ContaImpostoM extends Conta {
void debito(double val) {
super.debito(val + (val * 0.001));
}
ContaImpostoM (String num) {super (num);}
}
}
Subtipos e Subclasses
Subclasses e Comportamento
Objetos da subclasse comportam-se como os objetos da superclasse
Redefinições de métodos devem preservar o comportamento (semântica) do método original
Revisão/Otimização de Código
|
|
Modificação é Válida?
Subclasses e Evolução de Software
Deveria ser possível raciocinar sobre o código usando-se apenas a definição dos tipos das variáveis envolvidas (Conta)
Reuso sem Subtipos
Reuso preservando Subtipos
Definindo Classes Abstratas
abstract class ContaAbstrata {
private String numero;
protected double saldo;
void credito (double valor) {
saldo = saldo + valor;
}
abstract void debito (double valor);
String numero() {return numero;}
double saldo() {return saldo;}
}
Classes Abstratas
Possibilita herança de código preservando comportamento (semântica)
Pelo menos um método deve ser abstrato
Os métodos abstratos são implementados nas subclasses
Contas: Nova Descrição
class NovaConta extends ContaAbstrata {
void debito (double valor) {
saldo = saldo - valor;
}
NovaConta (String n) {
numero = n; saldo = 0;
}
}
Poupanças: Nova Descrição
class NovaPoupanca extends NovaConta {
void rende_juros(double t) {
this.credito(this.saldo() * t);
}
NovaPoupanca (String num) {
super (num);
}
}
Conta Especial: Nova Descrição
class NovaContaEspecial extends NovaConta {
private double bonus;
void credito(double valor) {
bonus = bonus + (valor * 0.01);
super.credito(valor);
}
void rende_bonus() {
super.credito(bonus);
bonus = 0;
}
double bonus() {return bonus;}
NovaContaEspecial (String num) {
super (num);
bonus = 0;
}
}
Conta Imposto: Descrição
class ContaImposto extends ContaAbstrata {
void debito(double val) {
saldo = saldo - (val + (val * 0.001));
}
ContaImposto (String num) {
numero = num; saldo = 0;
}
}
Substituição e Ligações Dinâmicas
...
ContaAbstrata ca, ca;
ca = new NovaContaEspecial(¨21.342-7¨);
ca = new ContaImposto(¨21.987-8¨);
ca.debito(500);
ca.debito(500);
System.out.println(ca.saldo());
System.out.println(ca.saldo());
...
Sérgio Soares(scbs@di.ufpe.br) |