• Nenhum resultado encontrado

11-Heranca

N/A
N/A
Protected

Academic year: 2021

Share "11-Heranca"

Copied!
5
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. Introdução. Herança.  . 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. AULA 11. Estados do Objeto Conta creditar(20). Motivação  . Creditar creditar. Creditar creditar. Saldo. Número. Saldo. Número. 875,32. 21.342-7. 895,32. 21.342-7. debitar. 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?. debitar. Objeto Poupança. Estados do Objeto Poupança creditar(20). creditar Creditar Creditar creditar. Saldo. Número. 875,32. 21.342-7. renderJuros Creditar. Saldo. Número. 875,32. 21.342-7. debitar. Creditar renderJuros. Creditar creditar. Saldo. Número. 895,32. 21.342-7. Creditar renderJuros. debitar. debitar. © Ricardo Massa e Sérgio Soares. 1.

(2) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Estados do Objeto Poupança. Classe de Poupanças: Assinatura. renderJuros(0.01) Creditar creditar. Saldo. Número. 875,32. 21.342-7. Creditar renderJuros. Creditar creditar. Saldo. Número. 884,07. 21.342-7. debitar. Creditar renderJuros. debitar. 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); } }. 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) {} // ... }. © Ricardo Massa e Sérgio Soares. 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) {} }. E a aplicação bancária?  . Precisamos alterar a classe Banco (que tem um array de Conta) para trabalhar com objetos Poupanca. Por simplicidade vamos esquecer as classes repositórios por um instante e considerar que a classe Banco tem um array de Conta. Classe de Bancos: Descrição (1) public class BancoD { private Conta[] contas; private int indiceC; private PoupancaD[] poupancas; private int indiceP;. 2.

(3) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Classe de Bancos: Descrição (3). Classe de Bancos: Descrição (2) public void cadastrarConta(Conta c) { a? contas[indiceC] = c; enç r indiceC = indiceC + 1; e dif } la. qua. public void cadastrarPoupanca(PoupancaD p) { poupancas[indiceP] = p; indiceP = indiceP + 1; }. Classe de Bancos: Descrição (4). 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. Problemas  . 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); }. Subtipos e Subclasses. • 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  . Falta refletir relação entre tipos do “mundo real”. Herança  . Poupanca. Conta. © Ricardo Massa e Sérgio Soares. Duplicação desnecessária de código:. 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. 3.

(4) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Subclasses  . Herança. Comportamento.  . objetos da subclasse comportam-se como os objetos da superclasse  . Substituição. a descrição da superclasse pode ser usada para definir a subclasse  . objetos da subclasse podem ser usados no lugar de objetos da superclasse. Classe de Poupanças: Com herança. Reuso de Código. Extensibilidade algumas operações da superclasse podem ser redefinidas na subclasse. Extends. public class Poupanca extends Conta { public Poupanca (String numero) { super(numero); } public void renderJuros(double taxa) { double juros = this.getSaldo() * taxa; this.creditar(juros); } }.  .  .  . subclasse extends superclasse Mecanismo para definição de herança e subtipos Herança simples: só pode-se herdar uma classe por vez. Construtores da superclasse não são herdados, mas devem ser utilizados (via super). Extends: Restrições (1)  . 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. © Ricardo Massa e Sérgio Soares. Extends: Restrições (2)  . Qualificador protected: visibilidade restrita ao pacote e as subclasses em outros pacotes. package br.ufpe.cin.banco; public class Conta { protected double saldo; //.... Funciona, mas não use!. package br.ufpe.cin.bancoItau; import br.ufpe.cin.banco.Conta; public class Poupanca extends Conta { //... public void renderJuros(double taxa) { double juros = this.saldo * taxa; this.saldo = this.saldo + juros; } }. 4.

(5) Graduação em Ciência da Computação - CIn/UFPE - Introdução à Programação - IF669. Usando Poupanças. Extends: Restrições (3)  . (testando a classe em um método main). Construtor default só é disponível se também for disponível na superclasse. ... Poupanca poupanca; poupanca = new Poupanca(“21.342-7”); poupanca.creditar(500.87); poupanca.debitar(45.00); System.out.println(poupanca.getSaldo()); .... public class Poupanca extends Conta { public Poupanca () { super(); } // ... } Só funciona se Conta também tiver um construtor default. Subtipos: Substituição ... Conta conta; conta = new Poupanca(“21.342-7”); conta.creditar(500.87); conta.debitar(45.00); System.out.println(conta.getSaldo()); .... Exercício  . Defina as classes • 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 • aula11.br.ufpe.cin.banco.Poupanca que herda de Conta — Define um construtor que recebe o número 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). 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  Defina a classe aula11.br.ufpe.cin.banco.Programa com um método main que testa os metodos da classe Banco pelo menos três vezes.  . © Ricardo Massa e Sérgio Soares. 5.

(6)

Referências

Documentos relacionados

h) Não se aplica o disposto neste item à cota reservada as microempresas, empresas de pequeno porte. 10.12 O encerramento da fase competitiva dar-se-á quando,

• 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

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

Based on the theory that the muscle strength of elderly in- dividuals responds differently to an activity program, ac- cording to the presence or absence of a medical diagnosis

Trata-se de um tempo privilegiado, um tempo singular centrado na Fé, num ano em que se comemoram também os 50 anos da abertura do Concílio Vaticano II e os

milesi no período de 28 dias, em porcentagem...41 Tabela X: Siparuna guianensis: Capacidade dos Grupos (G) obtidos do fracionamento da fase hexânica do extrato etanólico da folha

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