Escolar Documentos
Profissional Documentos
Cultura Documentos
saldo
numero
875,32 21.342-7
debitar
creditar
Crdito
saldo
getSaldo
numero
Nmero
saldo
getSaldo
numero
Nmero
875,00 21.342-7
875,32
21.342-7
854,98 21.342-7
875,32
21.342-7
debitar
Dbito
debitar
Dbito
Subtipos e Subclasses
ContaImposto
Conta
Subclasses e Comportamento
Objetos da subclasse comportam-se como os objetos da superclasse Redefinies de mtodos devem preservar o comportamento (semntica) do mtodo original Grande impacto sobre manuteno/evoluo de software...
Reviso/Otimizao de Cdigo
... double m(Conta c) { return c.getSaldo(); } ...
Deveria ser possvel raciocinar sobre o cdigo usando-se apenas a definio dos tipos das variveis envolvidas (Conta) O comportamento do cdigo deveria ser independente do tipo do objeto (Conta, ContaEspecial, ContaImposto) associado a uma dada varivel em tempo de execuo
Poupana
ContaImpostoM
ContaEspecial
Conta
ContaImposto
Poupanca
ContaEspecial
Classes Abstratas
No cria-se objetos:
Mas podem (devem) ter construtores, para reuso Mtodos qualificados como protected para serem acessados nas subclasses
public class ContaEspecial extends Conta { public static final double taxa = 0.01; private double bonus; public ContaEspecial (String numero) { super (n); } public void creditar(double valor) { bonus = bonus + (valor * taxa); super.creditar(valor); } /* ... */
public ContaImposto (String numero) { super (numero); } public void debitar(double valor) { double imposto = valor * taxa; double total = valor + imposto; this.setSaldo(getSaldo() total); } }
Herdar cdigo sem quebrar noo de subtipos, preservando o comportamento do supertipo Generalizar cdigo, atravs da abstrao de detalhes no relevantes Projetar sistemas, definindo as suas arquiteturas e servindo de base para a implementao progressiva dos mesmos
Contas: Projeto OO
public abstract class ContaProjeto { private String numero; private double saldo; public abstract void creditar(double valor); public abstract void debitar(double valor); public String getNumero() { return numero; protected setSaldo(double saldo) { this.saldo = saldo; } /* ... */ }
Cliente: Projeto OO
public abstract class Cliente { private String nome; private ConjuntoContato contatos; /* ... */ public void incluirContato(Contato contato) { contatos.incluir(contato); } public abstract Endereco getEndereco(); public abstract Contato getContato(String tipo); /* ... */ }
Endereco
Telefone
EndEletronico EndPostal
Contato: Projeto OO
public abstract class Contato { private String tipo; public Contato (String tipo) { this.tipo = tipo; } public abstract String getInfoRotulo(); }
Endereo: Projeto OO
public abstract class Endereco extends Contato { public Endereco (String tipo) { super (tipo); } }
Endereco {
private String rua; private String cidade; // ... public EnderecoPostal(String cidade, String rua,/*...*/) { super (EnderecoPostal); this.cidade = cidade; this.rua = rua; // ... } public String getInfoRotulo() { return (Rua: + rua /*...*/); } }
Telefone: Projeto
public class Telefone extends Contato { private String ddd; private String numero; public Telefone(String ddd, String numero) { super (Telefone); this.numero = numero; this.ddd = ddd; } public String getInfoRotulo() { return (DDD: + ddd + Numero: + numero); } }
Auditor de Banco
public class AuditorB { private final static double MINIMO = 500.00; private String nome; /* ... */ public boolean auditarBanco(Banco banco) { double saldoTotal, saldoMedio; int numeroContas; saldoTotal = banco.saldoTotal() numeroContas = banco.numeroContas(); saldoMedio = saldoTotal/numeroContas; return (saldoMedio < MINIMO); } }
Problema
Duplicao desnecessria de cdigo O mesmo auditor deveria ser capaz de investigar qualquer tipo de banco que
Auditor Genrico
public class AuditorGenerico { private final static double MINIMO = 500.00; private String nome; /* ... */ public boolean auditarBanco(QualquerBanco banco) { double saldoTotal, saldoMedio; int numeroContas; saldoTotal = banco.saldoTotal() numeroContas = banco.numeroContas(); saldoMedio = saldoTotal/numeroContas; return (saldoMedio < MINIMO); } }
Definindo Interfaces
public interface QualquerBanco { double saldoTotal(); int numContas(); }
Interfaces
no definem atributos
no definem construtores
Interfaces
No pode-se criar objetos Definem tipo de forma abstrata, apenas indicando a assinatura dos mtodos Os mtodos so implementados pelos subtipos (subclasses)
implements
classe implements interface1, interface2, ... subtipo implements supertipo1, supertipo2, ...
Mltiplos supertipos:
uma classe pode implementar mais de uma interface (contraste com classes abstratas...)
implements
Usando Auditores
Banco b = new Banco(); BancoModular bm = new BancoModular(); Auditor a = new Auditor(); /* ... */ boolean r = a.auditarBanco(b); boolean r = a. auditarBanco(bm); /* ... */
Interfaces e Reusabilidade
Evita duplicao de cdigo atravs da definio de um tipo genrico, tendo como subtipos vrias classes no relacionadas Tipo genrico pode agrupar objetos de vrias classes definidas de forma independente, sem compartilhar cdigo via herana, tendo implementaes totalmente diferentes Classes podem at ter mesma semntica...
A estrutura para armazenamento das contas fornecida na inicializao do cadastro, e pode depois ser trocada!
Repositrio: Definio
public interface RepositorioContas { void inserir(Conta conta); Conta procurar(String numero); boolean existe(String numero); }
Repositrio: Implementaes
public class ConjuntoContas implements RepositorioContas {...}
public class ListaContas implements RepositorioContas {...} public class ArrayContas implements RepositorioContas {...} public class VectorContas implements RepositorioContas {...}