• Nenhum resultado encontrado

09 Heranca passagem parametro

N/A
N/A
Protected

Academic year: 2021

Share "09 Heranca passagem parametro"

Copied!
37
0
0

Texto

(1)Introdução a Programação – IF669 http://www.cin.ufpe.br/~if669. Herança e passagem de parâmetro AULA 09 Ricardo Massa F. Lima rmfl@cin.ufpe.br. Sérgio C. B. Soares scbs@cin.ufpe.br.

(2) Introdução n. Imagine que temos uma aplicação bancária com. • Uma classe Conta, que possui número, saldo e os métodos creditar e debitar • Uma classe Banco que possui um array de Conta (lembra das classes repositório?), que armazena as contas do banco.

(3) Estados do Objeto Conta creditar(20) Creditar creditar. Creditar creditar. Saldo. Número. Saldo. Número. 875,32. 21.342-7. 895,32. 21.342-7. debitar. debitar.

(4) Motivação n. Imagine agora que surge um novo requisito • O banco precisa trabalhar com poupanças que rendem juros uma vez por mês. O QUE FAZER?.

(5) Objeto Poupança creditar Creditar. Saldo. Número. 875,32. 21.342-7. debitar. renderJuros Creditar.

(6) Estados do Objeto Poupança creditar(20) Creditar creditar. Saldo. Número. 875,32. 21.342-7. debitar. Creditar renderJuros. Creditar creditar. Saldo. Número. 895,32. 21.342-7. debitar. Creditar renderJuros.

(7) Estados do Objeto Poupança renderJuros(0.01) Creditar creditar. Saldo. Número. 875,32. 21.342-7. debitar. Creditar renderJuros. Creditar creditar. Saldo. Número. 884,07. 21.342-7. debitar. Creditar renderJuros.

(8) Classe de Poupanças: Assinatura public class PoupancaD { public PoupancaD (String n) {} public void creditar(double valor) {} public void debitar(double valor) {} public String getNumero() {} public double getSaldo() {} public void renderJuros(double taxa) {} }.

(9) Classe de Poupanças: Descrição public class PoupancaD { private String numero; private double saldo; public void creditar (double valor) { saldo = saldo + valor; } // ... public void renderJuros(double taxa) { this.creditar(saldo * taxa); } }.

(10) E a aplicação bancária? n. Considere que temos uma classe Banco (que tem um array de Conta) e métodos para cadastrar, creditar, debitar... nas contas do banco.

(11) Classe Banco public class Banco { private Conta[] contas; private int indice; public Banco() {} public void cadastrarConta(Conta c) { contas[indice] = c; indice = indice + 1; } public void creditarConta(String numero, double valor) {} // ... }.

(12) O que a classe Poupanca muda na aplicação bancária? n. Precisamos alterar a classe Banco (que tem um array de Conta) para trabalhar com objetos Poupanca.

(13) Classe de Bancos: Assinatura public class BancoD { public BancoD() {} public void cadastrarConta(Conta c) {} public void creditarConta(String numero, double valor) {} public void cadastrarPoupanca(PoupancaD p) {} public void creditarPoupanca(String numero, double valor) {} // ... }.

(14) Classe de Bancos: Descrição (1) public class BancoD { private Conta[] contas; private int indiceC; private PoupancaD[] poupancas; private int indiceP;.

(15) Classe de Bancos: Descrição (2) public void cadastrarConta(Conta c) { contas[indiceC] = c; indiceC = indiceC + 1; } public void cadastrarPoupanca(PoupancaD p) { poupancas[indiceP] = p; indiceP = indiceP + 1; }.

(16) Classe de Bancos: Descrição (3) private Conta procurarConta(String numero) { int i = 0; boolean achou = false; Conta resposta = null; while ((! achou) && (i < indiceC)) { if (contas[i].getNumero().equals(numero)) { achou = true; resposta = contas[i]; } else { i = i + 1; } } if (!achou) throw new RuntimeException(“Não achou”); return resposta; } Atenção: Por enquanto, vamos indicar erros assim. Mas isso vai mudar.

(17) Classe de Bancos: Descrição (4) public void debitarConta(String numero, double valor) { Conta c; c = this.procurarConta(numero); c.debitar(valor); } public void creditarConta(String numero, double valor) { Conta c; c = this.procurarConta(numero); c.creditar(valor); }.

(18) Problemas n. Duplicação desnecessária de código:. • a definição de PoupancaD é uma simples extensão da definição de Conta. • clientes de Conta que precisam trabalhar também com PoupancaD terão que ter código especial para manipular poupanças n. Falta refletir relação entre tipos do “mundo real”.

(19) Subtipos e Subclasses Poupanca. Conta.

(20) Herança n. Necessidade de estender classes • alterar classes já existentes e adicionar propriedades ou comportamentos para representar outra classe de objetos • criar uma hierarquia de classes que “herdam” propriedades e comportamentos de outra classe e definem novas propriedades e comportamentos.

(21) Subclasses n. Comportamento objetos da subclasse comportam-se como os objetos da superclasse. n. Substituição objetos da subclasse podem ser usados no lugar de objetos da superclasse.

(22) Herança n. Reuso de Código a descrição da superclasse pode ser usada para definir a subclasse. n. Extensibilidade algumas operações da superclasse podem ser redefinidas na subclasse.

(23) Classe de Poupanças: Com herança public class Poupanca extends Conta { public Poupanca (String numero) { super(numero); } public void renderJuros(double taxa) { double juros = this.getSaldo() * taxa; this.creditar(juros); } } Construtores da superclasse não são herdados, mas devem ser utilizados (via super).

(24) Extends n. n. n. subclasse extends superclasse Mecanismo para definição de herança e subtipos Herança simples: só se pode herdar uma classe por vez.

(25) Extends: Restrição n. Atributos e métodos privados são herdados, mas não podem ser acessados diretamente. public class Poupanca extends Conta { public Poupanca (String numero) { super(numero); } public void renderJuros(double taxa) { double juros = this.saldo * taxa; this.saldo = this.saldo + juros; } } Erro.

(26) Usando Poupanças. (testando a classe em um método main). ... Poupanca poupanca; poupanca = new Poupanca(“21.342-7”); poupanca.creditar(500.87); poupanca.debitar(45.00); System.out.println(poupanca.getSaldo()); ....

(27) Subtipos: Substituição ... Conta conta; conta = new Poupanca(“21.342-7”); conta.creditar(500.87); conta.debitar(45.00); System.out.println(conta.getSaldo()); ....

(28) Referências n. Objetos são manipulados através de referências c == null ?. Conta c;. creditar. c = new Conta("1287",0);. c. N úmero. Saldo. "123-x". 354,78. dedbtar. c.getSaldo(); envia a mensagem getSaldo() ao objeto referenciado pela variável c.

(29) Aliasing n. Mais de uma variável armazenando a mesma referência para um dado objeto. Conta a = new Conta("123-4",34); Conta b; a e b passam a b = a; referenciar o mesmo objeto b.creditar(100); System.out.println(a.getSaldo()); qualquer efeito via b é refletido via a.

(30) Passagem de parâmetro n. n. Em Java, a passagem de parâmetro é sempre por valor O valor da expressão é avaliado primeiro e depois passado para o método chamado • variáveis primitivas armazenam valores — ‘a’, 1, true, 50.89. • variáveis referência armazenam a referência, não o objeto! A avaliação de uma expressão é feita da esquerda para a direita.

(31) Passagem de parâmetro por valor public class PassagemPorValor { public void incrementa(int x){ x = x + 1; System.out.println(x); } } PassagemPorValor p; p = new PassagemPorValor(); int y = 1; não altera o valor de y. System.out.println(y); p.incrementa(y); System.out.println(y);.

(32) Referências são valores! public class Referencia { public void redefine (Conta a) { Conta b = new Conta(“567-8”,55); a.creditar(100); a = b; a.creditar(100); } } não altera o valor de c. altera o estado do objeto referenciado por c. Referencia r; r = new Referencia(); Conta c = new Conta(“123-4”,12); r.redefine(c); System.out.println(c.getSaldo());.

(33) Passagem de Parâmetros n. n. A passagem por referência nunca é feita no Java Um objeto nunca é passado como parâmetro, mas sim uma referência para um objeto, e a referência é passada por valor.

(34) Pergunta public class Referencia { public void redefine (Conta a) { Conta b = new Conta(“567-8”,55); a.creditar(100); a = b; a.creditar(100); } }. Modifique o código para acessar, neste ponto do programa, os dados da nova conta crida em redefine.. Referencia r; r = new Referencia(); Conta c = new Conta(“123-4”,12); r.redefine(c); System.out.println(c.getSaldo());.

(35) Resposta public class Referencia { public Conta redefine (Conta a) { Conta b = new Conta("567-8",55); a.creditar(100); a = b; a.creditar(100); return b; } } Referencia r; r = new Referencia(); Conta c = new Conta("123-4",12); c = r.redefine(c); System.out.println(c.getSaldo());.

(36) Exercício Defina as classes n aula11.br.ufpe.cin.banco.Conta com • Atributos: numero (String) e saldo (double) • Construtor que recebe o número como parâmetro e inicializa o saldo sempre com zero • Métodos: creditar, debitar e get para os atributos n aula11.br.ufpe.cin.banco.Poupanca que herda de Conta • Define um construtor que recebe o número da conta como parâmetro e chama o construtor da superclasse • Define o método renderJuros que recebe a taxa de juros como parâmetro e rende o juros (como na aula).

(37) cont.. Defina a classe aula11.br.ufpe.cin.banco.Banco com • Os seguintes atributos (sempre private): — contas – um array de Conta — indice – um inteiro que guarda o índice do array onde será inserido a próxima Conta (inicia pelo índice zero) • Um construtor que inicializa o array com 100 posições e o indice com zero • Os métodos (lembre-se de usar o atributo indice): — cadastrar – recebe uma Conta e insere no array — creditar – recebe o numero de uma conta e o valor a ser creditado e faz o crédito na conta do array — debitar - recebe o número e o valor a ser debitado — getSaldo – recebe o número da conta e retorna o saldo n Defina a classe aula11.br.ufpe.cin.banco.Programa com um método main que testa os metodos da classe Banco n.

(38)

Referências

Documentos relacionados

The choice of solvent, an ethyl-ester of ricinoleic acid or castor-oil based biodiesel, was elaborated in previous work (Zautsen et al., 2011a) and based on the

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

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

• 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

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

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