• Nenhum resultado encontrado

12 ClassesAbstratas Interfaces

N/A
N/A
Protected

Academic year: 2021

Share "12 ClassesAbstratas Interfaces"

Copied!
57
0
0

Texto

(1)Introdução a Programação – IF669 http://www.cin.ufpe.br/~if669. Classes Abstratas e Interfaces AULA 12 Ricardo Massa F. Lima rmfl@cin.ufpe.br. Sérgio C. B. Soares scbs@cin.ufpe.br.

(2) Até aqui n . n . Quando usar herança? Ao redefinir um método manter o comportamento herdado!.

(3) Adivinhem... n . n . Surge um novo requisito na aplicação bancária Temos de cobrar um imposto em certos tipos de contas • Lembram da CPMF?.

(4) Objeto Conta Imposto creditar. saldo. numero. 875,32 21.342-7. debitar.

(5) Estados do Objeto Conta Imposto 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. 21.342-7. Débito.

(6) Conta Imposto: Assinatura Sem herança public class ContaImposto { public ContaImposto (String numero) {} public void creditar(double valor) {} public void debitar(double valor) {} public String getNumero() {} public double getSaldo() {} }.

(7) Conta Imposto: Assinatura Com herança public class ContaImpostoM extends Conta { public ContaImpostoM(String numero) {} public void debitar(double valor) {} }.

(8) Conta Imposto: Descrição Com herança public class ContaImpostoM extends Conta { private static final double CPMF = 0.001; public ContaImpostoM (String numero) { super (numero); } public void debitar(double valor) { double imposto = (valor * CPMF); super.debitar(valor + imposto); } }.

(9) Subtipos e Subclasses ContaImposto. Conta.

(10) Subclasses e Comportamento (1) n . 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 public class Banco { private Conta[] contas; private int indice; // ... }.

(11) Subclasses e Comportamento (2) n . Redefinições de métodos devem preservar o comportamento (semântica) do método original • No que diz respeito ao comportamento (e atributos) herdado. n . Grande impacto sobre manutenção/ evolução de software....

(12) 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?.

(13) Subclasses e Evolução de Software n . n . 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.

(14) Reuso sem Subtipos Conta. Poupanca. ContaImpostoM. ContaEspecial ContaImpostoM muda a semântica do método debitar e, se herdar de Conta, quebra a noção de subtipos!!!.

(15) Qual a alternativa então? n . n . 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 ....

(16) Reuso preservando Subtipos ContaAbstrata. Conta. Poupanca. ContaImposto. ContaEspecial.

(17) 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; }.

(18) 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.

(19) Revisão/Otimização de Código ... double m(ContaA c) { c.creditar(10); c.debitar(10); return c.getSaldo(); } .... ... double m(ContaA c) { return c.getSaldo(); } .... E agora, a modificação é correta? Em que contextos?.

(20) Classes Abstratas n . Possibilita herança de código preservando comportamento (semântica) • Não do método debitar, que ainda não possui comportamento. n . Métodos abstratos: • geralmente, existe pelo menos um • são implementados nas subclasses. n . Não se cria objetos: • mas devem ter construtores para reuso • se necessário, métodos protected para serem acessados nas subclasses.

(21) Contas: Descrição Modificada public class Conta extends ContaAbstrata { public Conta(String numero) { super (numero); } public void debitar(double valor) { this.setSaldo(this.getSaldo() - valor); } } Implementação do método abstrato observe o uso do método protected.

(22) Poupanças: Descrição Original public class Poupanca extends Conta { public Poupanca(String numero) { super (numero); } public void renderJuros(double taxa) { this.creditar(this.getSaldo() * taxa); } } Nada mudou para Poupanca.

(23) 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.

(24) 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.

(25) Substituição e Ligações Dinâmicas 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()); Exemplo de um trecho do método main, usado para teste.

(26) Classes Abstratas: Utilização n . n . n . 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.

(27) 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; } //... }.

(28) Outro exemplo Pessoa: Reuso e Subtipos Pessoa. PessoaJuridica. PessoaFisica.

(29) Pessoa: Projeto OO public abstract class Pessoa { private String nome; ... public abstract String getCodigo(); }.

(30) Pessoa Física: Projeto OO public class PessoaFisica extends Pessoa { private String cpf; ... public String getCodigo() { return cpf; } }.

(31) Pessoa Jurídica: Projeto OO public class PessoaJuridica extends Pessoa { private String cnpj; ... public String getCodigo() { return cnpj; } }.

(32) 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; } }.

(33) Exercício n . n . n . n . n . n n . 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.

(34) Interfaces.

(35) Encapsulamento e Information Hiding n . A habilidade em “esconder” de forma segura dados e métodos de uma classe dentro da “cápsula”da classe, impedindo acesso de usuários não confiáveis é conhecida como information hiding. mas...por que estamos interessados em fazer isso?.

(36) Por que ecapsulamento com information hiding é útil? n . Esconder detalhes de implementação • evita que outros programadores façam uso dessas informações com algum propósito • torna possível modificar a implementação com a segurança de que não afetará o código que utiliza a classe.

(37) Por que ecapsulamento com information hiding é útil? n . Protege a classe de interferências externas indesejáveis (sejam elas acidentais ou propositais). • A classe contém conjunto de campos interdependentes, que devem ser mantidos em um estado consistente • Se for permitido a algum usuário externo (ou você mesmo) modificar um campo sem modificar campos relacionados a ele, a classe ficará em um estado inconsistente • Se, por outro lado, o acesso é feito via um método, há mais chances de que o estado será mudado de maneira consistente.

(38) Por que ecapsulamento com information hiding é útil? n . n . Se todos os dados da classe estão escondidos e podem ser acessados apenas via métodos da classe e esses métodos foram bem testados, haverá maior garantia de que os dados serão modificados consistentemente Se, por outro lado, for permitido acesso externo, o número de possibilidades a serem testadas torna-se não gerenciável..

(39) Por que ecapsulamento com information hiding é útil? n . Se atributos públicos que são acessados diretamente por outras classes forem modificados, as classes que os acessam diretamente serão afetadas • Acessando os mesmos com métodos pode evitar esse impacto. n . Se um determinado método for definido apenas para uso interno da classe, esconder esse método evita que usuários da classe tentem usá-lo.

(40) Por que ecapsulamento com information hiding é útil? Menos nobre, mas... se um campo ou método de uma classe for visível, você terá que documentá-lo economize seu tempo e esforço! esconda os campos e métodos ao máximo!.

(41) Interfaces n . n . n . n . Através do encapsulamento, os atributos e a implementação dos métodos de uma certa classe não são visíveis ao usuário da classe Conhecendo-se apenas a interface de uma classe, podemos utilizar seus objetos sem conhecer detalhes de implementação Uma interface inclui os métodos disponíveis e suas respectivas assinaturas Além disto, existem casos onde existe a necessidade de se ter uma classe mas não queremos implementá-la • pode-se terceirizar a implementação, fornecendo como especificação a interface desejada..

(42) Interfaces - Exemplo n . n . n . Implementar um zoológico virtual com vários tipos de animais Você gostaria de enviar as seguintes mensagens a cada animal: • nasca() • passeie() • durma() • peso(). Vamos pedir ajuda a programadores especialistas em cada tipo de animal.

(43) Interfaces - Exemplo.

(44) Interfaces - Exemplo n . O programador que for implementar o morcego terá que dizer explicitamente que vai usar a interface Animal • palavra chave implements A palavra chave implements obriga o programador a escrever o código de todos os métodos na assinatura Todos os métodos da interface devem ser públicos.

(45) Interfaces - Exemplo.

(46) Interfaces - Exemplo.

(47) Interfaces - Observação Em cada arquivo deve existir no máximo uma classe pública! Logo, as classes Ornitorrinco, Morcego e Zebra devem estar em arquivos separados, com os respectivos nomes. Ornitorrinco.java. Zebra.java. Morcego.java.

(48) Interfaces Cada um dos animais, além de ser um objeto da própria classe, também é um objeto do tipo Animal lido á V () s a do r i t l s á i v L - In onta c ) . ( 1 z tras s i L onta c . 2 z.

(49) Implementando mais de uma interface por vez n . Considere as duas interface:. n . Vamos implementar essas três classes.

(50) Implementando mais de uma interface por vez.

(51) Implementando mais de uma interface por vez Finalmente, podemos ver o Aviao que implementa as duas interfaces:.

(52) Mas e na aplicação bancária? Onde usar interfaces? n . n . n . n . Hoje a classe Banco tem um array de Conta E se amanhã quisermos utilizar outra estrutura de dados? E se quisermos depois de amanhã utilizar um banco de dados? Vamos desacoplar as regras de negócio do Banco de onde as contas são armazenadas.

(53) Criar uma interface de armazenamento de dados public interface RepositorioContas { void inserir(ContaAbstrata conta); ContaAbstrata procurar(String numero); void remover(String numero); void atualizar(ContaAbstrata conta); boolean existe(String numero); } Todos os métodos são public e abstract por default e não se definem atributos nem construtores.

(54) Repositório: Implementações public class RepositorioContasArray implements RepositorioContas {...} public class RepositorioContasLista implements RepositorioContas {...} public class RepositorioContasVector implements RepositorioContas {...} public class RepositorioContasBDR implements RepositorioContas {...}.

(55) Banco: Parametrização public class Banco { private RepositorioContas contas; public Banco(RepositorioContas rep){ this.contas = rep; } public void cadastrar(ContaAbstrata conta){ String numero = conta.getNumero(); if (!contas.existe(numero)) { contas.inserir(conta); } else { throw new RuntimeException(“Já cad...”); } // ... }. A estrutura para armazenamento das contas é fornecida na inicialização do banco, e pode ser trocada!.

(56) O que usar? Quando? Classes (abstratas) n Agrupa objetos com implementações compartilhadas n Define novas classes através de herança (simples) de código n Uma classe pode ter apenas uma como superclasse. Interfaces n Agrupa objetos com implementações diferentes n Define novas interfaces através de herança (múltipla) de assinaturas n Uma classe pode ter várias como supertipo.

(57) Exercício. n . n . Utilize a solução dos exercícios da última aula http://www.cin.ufpe.br/~if669/material/solucoes/aula13.zip Defina no pacote aula14.br.ufpe.cin.dados a interface RepositorioContas com os métodos • • • • • . n . inserir – recebe uma ContaAbstrata e insere no repositório procurar – recebe um número e retorna a conta se estiver no repositório remover – recebe um número para remover a conta do repositório atualizar - recebe uma ContaAbstrata para atualizar no repositório existe – recebe um número e informa se existe uma conta com este número no repositório. Modifique a classe Banco para utilizar a interface definida (receba a implementação da interface no construtor) • Perceba que a classe Banco compila apenas com a interface. Já a classe Programa precisa de uma implementação para executar.. n . n . Defina no pacote aula14.br.ufpe.cin.dados classe RepositorioContasArray que implementa a interface RepositorioContas Altere a classe Programa para fazer os testes.

(58)

Referências

Documentos relacionados

‘ O crime de insubmissão previsto no artigo 183 do CPM (‘deixar de apresentar-se o convocado à incorporação, dentro do prazo que lhe foi marcado ...’) aplica-se apenas aos

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

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

Fica garantido pelos EMPREGADORES o fornecimento de VALE ALIMENTAÇÃO OU VALE REFEIÇÃO a todos os EMPREGADOS em atividade das categorias albergadas por esta CONVENÇÃO COLETIVA

EMPENHO LIQUIDAÇÂO PAGAMENTO TIPO CBO PAGTO.. MESTRADO

Convencionam as partes que, exclusivamente para os empregados que mantêm contrato de trabalho com a mesma empresa ou, empresa do mesmo grupo econômico há mais de 10 (dez) anos e

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

1964: Managing for Results (“Administrando para Obter Resultados”, ed. Thomson Pio- neira). Neste livro, que complementa The Practice of Management, Drucker explica por que é