A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota

Apresentações semelhantes


Apresentação em tema: "Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota"— Transcrição da apresentação:

1

2 Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota acm@cin.ufpe.br http://www.cin.ufpe.br/~acm

3 Classes Abstratas Objetivo Depois desta aula você será capaz de desenvolver sistemas mais reusáveis e extensíveis, através da utilização de classes abstratas que permitem relacionar classes que compartilham parte dos seus códigos mas que se comportam de forma radicalmente diferente em alguns casos.

4 Classes Abstratas Leitura prévia essencial Seções 7.13 a 7.20 do livro Java: how to program (de Harvey e Paul Deitel)

5 numerosaldo 21.342-7 875,32 Objeto Conta Imposto creditar debitar

6 Número getSaldo 21.342-7 875,32 Crédito Débito Estados do Objeto Conta Imposto numerosaldo 21.342-7 875,00 debitar(20) creditar debitar Número getSaldo 21.342-7 875,32 Crédito Débito numerosaldo 21.342-7 854,98 creditar debitar

7 Conta Imposto: Assinatura public class ContaImposto { public ContaImposto (String numero) {} public void creditar(double valor) {} public void debitar(double valor) {} public String getNumero() {} public double getSaldo() {} }

8 Conta Imposto: Assinatura public class ContaImpostoM extends Conta { public ContaImpostoM(String numero) {} public void debitar(double valor) {} }

9 Conta Imposto: Descrição public class ContaImpostoM extends Conta { private static final double taxa = 0.0038; public ContaImpostoM (String numero) { super (numero); } public void debitar(double valor) { double imposto = (valor * taxa); super.debitar(valor + imposto); }

10 Subtipos e Subclasses ContaImposto Conta

11 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 Grande impacto sobre manutenção/evolução de software...

12 Revisão/Otimização de Código... double m(Conta c) { c.creditar(x); c.debitar(x); return c.getSaldo(); }... Modificação é correta? Em que contextos?... double m(Conta c) { return c.getSaldo(); }...

13 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 ) 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 PoupançaContaImpostoM ContaEspecial

15 Reuso preservando Subtipos ContaAbstrata ContaImposto Conta PoupancaContaEspecial

16 Definindo Classes Abstratas public abstract class ContaAbstrata { private String numero; private double saldo; public ContaAbstrata (String numero) { this.numero = numero; saldo = 0.0; } public void creditar(double valor) { saldo = saldo + valor; }

17 Definindo Classes Abstratas public double getSaldo() { return saldo; } public String getNumeto() { return numero; } public abstract void debitar(double valor); protected void setSaldo(double saldo) { this.saldo = saldo; }

18 Classes Abstratas Possibilita herança de código preservando comportamento (semântica) Métodos abstratos: – geralmente existe pelo menos um – são implementados nas subclasses Não se criam objetos: –mas podem (devem) ter construtores, para reuso –métodos qualificados como protected para serem acessados nas subclasses

19 Contas: Descrição Modificada public class Conta extends ContaAbstrata { public Conta(String numero) { super (numero); } public void debitar(double valor) { this.setSaldo(getSaldo() - valor); }

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

21 Conta Especial: Descrição Original public class ContaEspecial extends Conta { public static final double TAXA = 0.01; private double bonus; public ContaEspecial (String numero) { super (numero); } public void creditar(double valor) { bonus = bonus + (valor * TAXA); super.creditar(valor); }... }

22 Conta Imposto: Descrição public class ContaImposto extends ContaAbstrata { public static final double TAXA = 0.0038; public ContaImposto (String numero) { super (numero); } public void debitar(double valor) { double imposto = valor * TAXA; double total = valor + imposto; this.setSaldo(getSaldo() – total); }

23 Substituição e Ligações Dinâmicas... ContaAbstrata ca, ca’; ca = new ContaEspecial(¨21.342-7¨); ca’ = new ContaImposto(¨21.987-8¨); ca.debitar(500); ca’.debitar(500); System.out.println(ca.getSaldo()); System.out.println(ca’.getSaldo());...

24 Classes Abstratas: Utilização 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

25 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; }... }

26 Cliente: Projeto OO public abstract class Cliente { private String nome; private RepositorioContatos contatos;... public void incluirContato(Contato contato) { contatos.incluir(contato); } public abstract Endereco getEndereco(); public abstract Contato getContato(String tipo);... }

27 Contato: Reuso e Subtipos Contato Telefone Endereco EndEletronico EndPostal

28 Contato: Projeto OO public abstract class Contato { private String tipo; public Contato (String tipo) { this.tipo = tipo; }... public abstract String getInfoRotulo(); }

29 public abstract class Endereco extends Contato { public Endereco (String tipo) { super (tipo); } Endereço: Projeto OO

30 Endereço Eletrônico: Projeto OO public class EnderecoEletronico extends Endereco { private String email; public EnderecoEletronico(String email) { super (“EnderecoEletronico”); this.email = email; } public String getInfoRotulo() { return (“Email: ” + email); }

31 Endereço Residencial: Projeto public class EnderecoPostal extends 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 +...); }

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

33 Pessoa: Reuso e Subtipos Pessoa PessoaFisica PessoaJuridica

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

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

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

37 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; }

38 Exercícios Modifique a classe Banco para que seja possível armazenar todos os tipos de contas vistos em aula.

39 Classes Abstratas Resumo Importância de redefinir métodos preservando a semântica dos métodos originais Cláusula abstract para classes Cláusula abstract para métodos Classes abstratas e projeto e estruturação de sistemas

40 Classes Abstratas Leitura adicional Capítulo 7 do livro Thinking in Java (de Bruce Eckel) Seções 4.7 e 4.10 do livro A Programmer’s Guide to Java Certification (de Khalid Mughal e Rolf Rasmussen)


Carregar ppt "Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota"

Apresentações semelhantes


Anúncios Google