Alcides Pamplona Linguagem de Programação CESBD 2010 Alcides Pamplona alcides.pamplona@gmail.com
Tópicos Ligação Dinamica Polimorfismo Verificação Dinâmica de Tipos 2
Introdução A vinculação ou ligação dinâmica permite determinar dinamicamente que método de certo objeto será executado. 3
Ligação Dinâmica Implementação da classe Venda 4
Ligação Dinâmica Implementação da classe VendaPrazo 5
Ligação Dinâmica Uma mensagem só é ligada a um método em tempo de execução ligação dinâmica Na ligação estática, a ligação entre a chamada de um subprograma e sua implementação é estabelecida em tempo de compilação Com a herança, não se sabe exatamente qual o método a ser invocado até que se conheça o tipo real do objeto (tipo dinâmico). Durante a compilação só temos o tipo das referências (tipo estático) 6 Alcides Pamplona Linguagem de Programação CESBD 2010
Ligação Dinâmica Considere o Código 7
Ligação Dinâmica Na execução do código são criados objetos como abaixo: 8
Ligação Dinâmica Observando novamente o código: 9
Ligação Dinâmica 10
Ligação Dinâmica Para isso, deve-se declarar uma referência do tipo da superclasse e criar um objeto da subclasse A ligação dinâmica permite o polimorfismo A chamada do mesmo método pode assumir várias formas, dependendo do objeto criado em tempo de execução 11
Polimorfismo 12
Polimorfismo 13
Polimorfismo 14
Polimorfismo Declarar uma referência da superclasse e instanciar objetos da subclasse Métodos com a mesma assinatura implementações diferentes Por exemplo: A classe conta e poupança possuem o método saque, o qual possui implementações diferentes devido à cobrança da CPMF OBS: A consideração importante é que todo objeto da subclasse (subtipo) é um objeto da superclasse (supertipo) 15
Polimorfismo public class TestaConta{ public static void main (String [ ] args ){ Conta c = new Conta (); c.setnumero("001"); c.setsaldo(100.0); System.out.println(c.sacar(100.0)); } 16 } c = new ContaPoupanca(); c.setnumero("002"); c.setsaldo(200.0); System.out.println(c.sacar(100.0)); Ligação Dinâmica / Polimorfismo
Polimorfismo public class TestaConta { public static void main (String [ ] args ){ Conta [ ] repcontas = new Conta [3]; repcontas [0] = new Conta ( cc1,10.0); repcontas [1] = new Conta ( cc2,20.0); repcontas [2] = new ContaPoupanca( cp1,10.0); repcontas [3] = new ContaPoupanca( cp2,40.0 ); for (int i = 0; i <= 3; i++) System.out.println (repcontas[i].sacar(10.0)); } } 17
Lab01 - Override de Métodos 1. Crie uma classe aplicativo (TestaConta) e defina uma referência do tipo Conta e crie um objeto desse tipo. 2. Chame o método sacar do objeto criado. 3. Faça a referência declarada na questão anterior apontar para um novo objeto do tipo ContaPoupanca. 4. Chame o método sacar do objeto conta poupança e observe o resultado. 18
Verificação Dinâmica de Tipos - instanceof public class TestaConta { public static void main (String [ ] args ){ } ContaCorrente [ ] repcontas = new ContaCorrente [3]; repcontas [0] = repcontas [1] = repcontas [2] = new Conta ( cc1,10.0); new Conta ( cc2,20.0); new ContaPoupanca( cp1,10.0); repcontas [3] = new ContaPoupanca( cp2,40.0 ); for (int i = 0; i <= 3; i++) System.out.println (repcontas[i].render()); } Erro1: Compilação. O método render pertence somente ao subtipo(contapoupanca). Erro2: Execução. Solução: Type Cast Solução: instanceof ((ContaPoupanca)repContas[i]).render() if (repcontas[i] instanceof ContaPoupanca) System.out.println (((ContaPoupanca)repContas[i]).render()); 19
Verificação Dinâmica de Tipos - código corrigido public class TestaConta { } public static void main (String [ ] args ){ } Conta [ ] repcontas = new Conta [3]; repcontas [0] = repcontas [1] = repcontas [2] = new Conta ( cc1,10.0); new Conta ( cc2,20.0); new ContaPoupanca( cp1,10.0); repcontas [3] = new ContaPoupanca( cp2,40.0 ); for (int i = 0; i <= 3; i++) if (repcontas[i] instanceof ContaPoupanca) System.out.println (((ContaPoupanca)repContas[i]).render()); 20
Exercício 06 - Verificação Dinâmica de Tipos 1. Implemente, na classe conta poupança, um método render que deve acrescentar 1% sobre o saldo. 2. Na classe aplicativo, crie um array do tipo conta corrente com 3 posições. Armazene dois objetos do tipo conta corrente e um do tipo conta poupança. 3. Chame o método saldo dos objetos armazenados no array, execute e observe o resultado. 4. Ative o método render, compile e observe o resultado. 5. Corrija o erro de compilação verificando dinamicamente o tipo e execute o programa. 6. Corrija o erro usando cast e execute o programa. 21
Pontos Principais - Herança Herança permite o reuso de dados (atributos) e operações (métodos) Para acessar membros da superclasse a partir da subclasse deve-se usar a palavra super Construtores não são herdados e a única forma de acesso a partir de uma subclasse é através da palavra super A subclasse pode adicionar novos atributos e/ou métodos ou sobrepor (redefinir) métodos definidos em sua superclasse Na redefinição de métodos a subclasse deve preservar a assinatura: tipo de retorno, nome do método, quantidade e tipos dos argumentos 22
Pontos Principais - Polimorfismo A ligação dinâmica permite o polimorfismo A chamada do mesmo método pode assumir várias formas, dependendo do objeto criado em tempo de execução Métodos com a mesma assinatura implementações diferentes Declarar uma referência da superclasse e instanciar objetos das subclasses Todo objeto da subclasse (subtipo) é um objeto da superclasse (supertipo) 23
Projeto Implementar no projeto para a aula da próxima semana: Divisão em Camadas (Classes de visão, services, básicas e acesso a dados) Analisar o código e implementar Herança onde for viável Analizar o código e implementar polimorfismo onde for aplicável 24