• Nenhum resultado encontrado

13-ClassesAbstratas

N/A
N/A
Protected

Academic year: 2021

Share "13-ClassesAbstratas"

Copied!
6
0
0

Texto

(1)Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Introdução a Programação – IF669 http://www.cin.ufpe.br/~if669. Até aqui  . Classes Abstratas  . AULA 13.  . Ao redefinir um método manter o comportamento herdado!. Objeto Conta Imposto. Adivinhem...  . Quando usar herança?. Surge um novo requisito na aplicação bancária Temos de cobrar um imposto em certos tipos de contas. creditar. saldo. numero. 875,32 21.342-7. • Lembram da CPMF?. debitar. Estados do Objeto Conta Imposto. Conta Imposto: Assinatura Sem herança. debitar(20) creditar Crédito. creditar Crédito. saldo numero getSaldo Número. saldo numero getSaldo Número. 875,00 21.342-7. 854,98 21.342-7. debitar. debitar. 875,32. 21.342-7. Débito. 875,32. © Ricardo Massa e Sérgio Soares. 21.342-7. Débito. public class ContaImposto { public ContaImposto (String numero) {} public void creditar(double valor) {} public void debitar(double valor) {} public String getNumero() {} public double getSaldo() {} }. 1.

(2) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Conta Imposto: Assinatura Com herança. Conta Imposto: Descrição Com herança public class ContaImpostoM extends Conta { private static final double CPMF = 0.001;. public class ContaImpostoM extends Conta {. public ContaImpostoM (String numero) { super (numero); } public void debitar(double valor) { double imposto = (valor * CPMF); super.debitar(valor + imposto); }. public ContaImpostoM(String numero) {} public void debitar(double valor) {} }. }. Subclasses e Comportamento (1). Subtipos e Subclasses ContaImposto.  . Objetos da subclasse devem se comportar como os objetos da superclasse • Afinal de contas queremos usar objetos da subclasse onde os objetos da superclasse são utilizados. Conta. Subclasses e Comportamento (2)  . Redefinições de métodos devem preservar o comportamento (semântica) do método original • No que diz respeito ao comportamento (e atributos) herdado.  . Grande impacto sobre manutenção/ evolução de software.... public class Banco { private Conta[] contas; private int indice; // ... }. Revisão/Otimização de Código ... double m(Conta c) { c.creditar(10); c.debitar(10); return c.getSaldo(); } .... ... double m(Conta c) { return c.getSaldo(); } .... Considerando apenas o retorno do método m, as duas opcões são sempre equivalentes? Em que contextos?. © Ricardo Massa e Sérgio Soares. 2.

(3) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Subclasses e Evolução de Software  .  . Reuso sem Subtipos Conta. Deveria ser possível raciocinar sobre o código usando-se apenas a definição dos tipos das variáveis envolvidas (Conta) O comportamento do código deveria ser independente do tipo do objeto (Conta, ContaEspecial, ContaImposto) associado a uma dada variável em tempo de execução. Poupanca. ContaEspecial ContaImpostoM muda a semântica do método debitar e se herdar de Conta quebra a noção de subtipos!!!. Reuso preservando Subtipos. Qual a alternativa então?  .  . O que existe de comum entre Conta e ContaImposto? • Vamos criar uma nova classe que contenha essa parte em comum • Conta e ContaImposto devem herdar dessa nova classe Atenção: debitar é diferente nas duas classes • Mas ambas as contas devem permitir debitar um valor .... Definindo Classes Abstratas public abstract class ContaAbstrata { private String numero; private double saldo; public ContaAbstrata (String numero) { this.numero = numero; this.saldo = 0.0; } public void creditar(double valor) { this.saldo = this.saldo + valor; } public double getSaldo() { return this.saldo; }. © Ricardo Massa e Sérgio Soares. ContaImpostoM. ContaAbstrata. Conta. Poupanca. ContaImposto. ContaEspecial. Definindo Classes Abstratas public String getNumero() { return this.numero; } protected void setSaldo(double saldo) { this.saldo = saldo; } public abstract void debitar(double valor); } O método abstrato não tem implementação, mas 1. Permite programar (não executar) chamando o método da classe abstrata (na classe Banco, por exemplo) 2. Obriga que as subclasses concretas implementem o método. 3.

(4) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Revisão/Otimização de Código ... double m(ContaA c) { c.creditar(10); c.debitar(10); return c.getSaldo(); } .... Classes Abstratas  . ... double m(ContaA c) { return c.getSaldo(); } .... E agora, a modificação é correta? Em que contextos?. Contas: Descrição Modificada.  .  . Possibilita herança de código preservando comportamento (semântica) • Não do método debitar, claro Métodos abstratos: • geralmente existe pelo menos um • são implementados nas subclasses Não cria-se objetos: • mas devem ter construtores, para reuso • se necessário, métodos protected para serem acessados nas subclasses. Poupanças: Descrição Original. public class Conta extends ContaAbstrata { public Conta(String numero) { super (numero); } public void debitar(double valor) { this.setSaldo(this.getSaldo() - valor); } }. public class Poupanca extends Conta { public Poupanca(String numero) { super (numero); } public void renderJuros(double taxa) { this.creditar(this.getSaldo() * taxa); } }. Implementação do método abstrato observe o uso do método protected. Nada mudou para Poupanca. Conta Especial: Descrição Original public class ContaEspecial extends Conta { private static final double TAXA = 0.01; private double bonus; public ContaEspecial (String numero) { super(numero); this.bonus = 0.0; } public void creditar(double valor) { this.bonus = this.bonus + (valor * TAXA); super.creditar(valor); } } Nada mudou para ContaEspecial. © Ricardo Massa e Sérgio Soares. Conta Imposto: Descrição public class ContaImposto extends ContaAbstrata { private static final double CPMF = 0.001; public ContaImposto (String numero) { super(numero); } public void debitar(double valor) { double imposto = valor * CPMF; double total = valor + imposto; super.setSaldo(this.getSaldo() – total); } }. Implementação do método abstrato observe o uso do método protected. 4.

(5) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Substituição e Ligações Dinâmicas. Classes Abstratas: Utilização  . ContaAbstrata ca1, ca2; ca1 = new ContaEspecial(“21.342-7”); ca2 = new ContaImposto(“21.987-8”); ca1.debitar(500); ca2.debitar(500); System.out.println(ca1.getSaldo()); System.out.println(ca2.getSaldo());.  .  . Herdar código sem quebrar noção de subtipos, preservando o comportamento do supertipo Generalizar código, através da abstração de detalhes não relevantes Projetar sistemas, definindo as suas arquiteturas e servindo de base para a implementação progressiva dos mesmos. Exemplo de um pedaço de um método main. 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; } //... }. Outro exemplo Pessoa: Reuso e Subtipos Pessoa. PessoaJuridica. PessoaFisica. Pessoa: Projeto OO. Pessoa Física: Projeto OO. public abstract class Pessoa { private String nome; ... public abstract String getCodigo(); }. public class PessoaFisica extends Pessoa { private String cpf; ... public String getCodigo() { return cpf; } }. © Ricardo Massa e Sérgio Soares. 5.

(6) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Pessoa Jurídica: Projeto OO public class PessoaJuridica extends Pessoa { private String cnpj; ... public String getCodigo() { return cnpj; } }. public class RepositorioPessoasArray { private Pessoa[] pessoas; ... public Pessoa procurar(String codigo) { Pessoa p = null; boolean achou = false; for (int i=0; i<indice && !achou; i++) { p = pessoas[i]; if (p.getCodigo().equals(codigo)) achou = true; else p = null; } return p; } }. Exercício  .  .  .  .  .   . Utilize a solução do último exercício http://www.cin.ufpe.br/~if669/material/solucoes/aula12.zip Defina no pacote aula13.br.ufpe.cin.banco, a classe abstrata ContaAbstrata que tem os mesmos atributos e métodos de Conta, só que o método debitar é abstrato, como visto em sala Altere a classe Conta para herdar da classe ContaAbstrata e implementar o método debitar Modifique a classe Banco para que seja possível trabalhar com todos os tipos de conta da aplicação bancária. Execute a classe Programa e observe que o teste funciona como antes Defina a classe aula13.br.ufpe.cin.banco.ContaImposto que herda de ContaAbstrata e tem uma constante CPMF que armazena o imposto a ser cobrado quando um valor for debitado na ContaImposto É necessário alterar as classes Poupanca e ContaEspecial? Altere a classe Programa para testar todas as classes do projeto. © Ricardo Massa e Sérgio Soares. 6.

(7)

Referências

Documentos relacionados

This retrospective study assessed early, clinical and X-ray outcomes using this technique and the total metal-on-metal resurfacing prosthesis3. MATERIALS

11.1.1 Será acrescido ao valor da arrematação, e pago juntamente com os percentuais devidos ao Leiloeiro, itens 10.1 e 11.1, taxa administrativa calculada à razão de 1% (um por

78 Figura 3.27 Padrão de difração de pós obtido para o complexo ácido nalidíxico:Zn através (a) de síntese por solução, em comparação com os difractogramas

Sempre que as entidades adjudicantes recorrerem à possibilidade prevista no n.º 3, alínea a), de formular especificações técnicas em termos de desempenho ou de

O Secretário Geral da OTM-CS fez este pronunciamento durante a cerimónia de abertura da IV Sessão Ordinária do Conselho Nacional do SNEB, realizada em finais de

O LAVI vem sendo montado gradativamente, com recursos provenientes do FDA (Fundo de Desenvolvimento Acadêmico) e LABGRAD (Programa de Apoio aos Laboratórios de

A jurisprudência do Supremo Tribunal Federal entende que, quando há deliberação de PEC que seja contrária a uma das chamadas “cláusulas pétreas” da Constituição Federal

• uma entidade adquirida possui uma patente de tecnologia. Ela tem licença de uso exclusivo fora dos Estados Unidos, em troca deste uso a entidade recebe um percentual