0 évaluation0% ont trouvé ce document utile (0 vote)
51 vues50 pages
O documento discute o conceito de polimorfismo em Java e C++. Ele apresenta:
1) Uma introdução ao polimorfismo e exemplos de seu uso em Java para tratar objetos de subclasses de forma genérica;
2) Detalhes sobre classes abstratas, métodos abstratos e polimorfismo em Java;
3) Exemplos semelhantes de polimorfismo em C++ usando funções virtuais e classes abstratas.
O documento discute o conceito de polimorfismo em Java e C++. Ele apresenta:
1) Uma introdução ao polimorfismo e exemplos de seu uso em Java para tratar objetos de subclasses de forma genérica;
2) Detalhes sobre classes abstratas, métodos abstratos e polimorfismo em Java;
3) Exemplos semelhantes de polimorfismo em C++ usando funções virtuais e classes abstratas.
O documento discute o conceito de polimorfismo em Java e C++. Ele apresenta:
1) Uma introdução ao polimorfismo e exemplos de seu uso em Java para tratar objetos de subclasses de forma genérica;
2) Detalhes sobre classes abstratas, métodos abstratos e polimorfismo em Java;
3) Exemplos semelhantes de polimorfismo em C++ usando funções virtuais e classes abstratas.
Polimorfismo Prof. Leonardo Barreto Campos 2/50 Sumrio Introduo; Polimorfismo; Polimorfismo Java; Mtodos Abstratos Java Classes Abstratas Java Exerccio - Java Polimorfismo C++ Classe Abstrata C++; Funes Virtuais Puras C++ Classe-Base Virtual C++ Classes Amigas C++ Bibliografia; Prof. Leonardo Barreto Campos 3/50 Introduo A caracterstica de chamar mtodos de um objeto sem especificar o tipo exato dele conhecido como polimorfismo; A palavra polimorfismo significa assumir vrias formas. O polimorfismo permite escrever programas que processam objetos que compartilham a mesma superclasse em uma hierarquia de classes como se todas fossem objetos da superclasse; Prof. Leonardo Barreto Campos 4/50 Polimorfismo Exemplo: Considere uma classe veculo com duas classes derivadas, Automvel e Bicicleta. Essas classes tm trs mtodos, definidos para veculos de forma geral e redefinidos mais especificamente para automveis e bicicletas; Prof. Leonardo Barreto Campos 5/50 Polimorfismo As funes so: checkList(), para verificar o que precisa ser analisado no veculo; adjust(), para realizar os reparos e a manuteno necessria; cleanup(), para realizar procedimentos de limpeza do veculo. A aplicao Oficina define um objeto que recebe objetos da classe Veculo. Para cada veculo recebido, a oficina executa na seqncia os trs mtodos da classe Veculo. Prof. Leonardo Barreto Campos 6/50 Polimorfismo - Java Prof. Leonardo Barreto Campos 7/50 Polimorfismo - Java Prof. Leonardo Barreto Campos 8/50 Polimorfismo - Java Prof. Leonardo Barreto Campos 9/50 Polimorfismo - Java No h como saber no momento da programao se a Oficina estar recebendo um automvel ou uma bicicleta -- assim, o momento de deciso sobre qual mtodo ser aplicado s ocorrer durante a execuo do programa. Prof. Leonardo Barreto Campos 10/50 Polimorfismo - Java Prof. Leonardo Barreto Campos 11/50 Polimorfismo Consideraes: Upcasting O mtodo Oficina.proximo() realiza uma atribuio de um objeto Automvel varivel (referncia para objeto Veiculo) v quando o valor do nmero aleatrio gerado par (o resto da diviso inteira por 2 igual a 0). Essa atribuio de um objeto de uma classe mais especializada para uma referncia de uma classe ancestral denominada upcast. Esse mesmo tipo de atribuio realizado de Bicicleta para veculo quando o nmero aleatrio gerado mpar. Prof. Leonardo Barreto Campos 12/50 Polimorfismo Consideraes: Uso de mtodos abstratos Apesar de mtodos da classe Veculo terem sido definidos, estes nunca so invocados nesse exemplo. (Se fossem, algo estaria errado.) Isso ilustra uma situao onde mtodos abstratos poderiam ser utilizados, pois a definio do corpo desses mtodos de fato irrelevante. Ainda mais, se uma classe como essa s contm mtodos abstratos, ela poderia ser implementada como uma interface Java. Prof. Leonardo Barreto Campos 13/50 Classe Abstrata - Java Conforme vimos em herana, uma classe abstrata til quando no se quer instanciar objetos. As superclasses abstratas so utilizadas para que outras classes possam herdar e assim compartilhar um projeto comum. Em java, cria uma classe abstrata declarando-a com a palavra-cahve abstract: public abstract class Quadrilatero{ Prof. Leonardo Barreto Campos 14/50 Mtodos Abstratos - Java Uma classe abstrata normalmente contm um ou mais mtodos abstratos; Um mtodo abstrato um com a palavra-chave abstract na sua declarao, como em: public abstract float calcularArea(); Mtodos abstratos no fornecem implementaes. Uma classe que contm mtodos abstratos deve ser declarada como classe abstrata esmo que contenha mtodos concretos (no abstratos); Prof. Leonardo Barreto Campos 15/50 Exerccio - Java Exerccio: 1) Implemente, em Java, uma classe abstrata de nome Quadrilatero onde so declarados dois mtodos abstratos: float calcularArea(); float calcularPerimetro(); 2) Crie, como subclasse de Quadrilatero, uma classe de nome Retangulo cujas instncias so caracterizadas pelos atributos lado e altura ambos do tipo float. Implemente na classe Retangulo os mtodos herdados de Quadrilatero e outros que ache necessrios. Prof. Leonardo Barreto Campos 16/50 Exerccio - Java Exerccio: 3) Crie, como subclasse de Quadrilatero, uma classe de nome Circulo cujas instncias so caracterizadas pelo atributo raio do tipo float. Implemente na classe Circulo os mtodos herdados de Quadrilatero e outros que ache necessrios. Nota: poder aceder ao valor de Pi fazendo Math.Pi. 4) Crie, como subclasse de Retangulo, uma classe de nome Quadrado cujas instncias so caracterizadas por terem os atributos lado e altura com o mesmo valor. Prof. Leonardo Barreto Campos 17/50 Exerccio - Java Exerccio: 5) Elabore um programa de teste onde declarado um array, de dimenso 5, do tipo esttico Quadrilatero. Nesse array devem ser guardadas instncias de Rectangulo, Circulo e Quadrado seguindo uma ordem aleatria. Nota: para gerar nmeros aleatrios crie primeiro uma instncia da classe Random (presente na biblioteca java.util) e para extrair um inteiro entre 0 e n efectue a evocao nextInt(n). Depois implemente um ciclo que percorra o array evocando, relativamente a cada um dos objetos guardados, os mtodos calcularArea e calcularPerimetro. Prof. Leonardo Barreto Campos 18/50 Exerccio - Java Classe Quadriltero: Prof. Leonardo Barreto Campos 19/50 Exerccio - Java Continuao da Classe Quadriltero: Prof. Leonardo Barreto Campos 20/50 Exerccio - Java Classe Retangulo: Prof. Leonardo Barreto Campos 21/50 Exerccio - Java Classe Circulo: Prof. Leonardo Barreto Campos 22/50 Exerccio - Java Classe Quadrado: Prof. Leonardo Barreto Campos 23/50 Exerccio - Java Programa de Teste: Prof. Leonardo Barreto Campos 24/50 Exerccio - Java Sada no Console do programa anterior: Prof. Leonardo Barreto Campos 25/50 Exerccio - Java Prof. Leonardo Barreto Campos 26/50 Exerccio - Java Consideraes: Entenda porque imprime a mensagem dentro do construtor Retangulo na criao de um objeto Quadrado; Refaa o exemplo excluindo o quadriltero crculo e inserindo os quadrilteros Trapzio e Losango; Retire as leituras desnecessrias, por exemplo, altura e raio para Quadrado; Imprima os dados personalizados na apresentao dos clculos, por exemplo, A rea do retngulo de altura x e largura y : z; Prof. Leonardo Barreto Campos 27/50 Classe Abstrata C++ Em C++, uma classe abstrata uma classe que define uma funo virtual pura; Mas o que uma funo virtual? uma funo que impede a classe declarar qualquer objeto dela; Em C++, o polimorfismo possvel atravs de funes virtuais, vejamos como: Prof. Leonardo Barreto Campos 28/50 Polimorfismo C++ virtual palavra-chave includa no incio da declarao do mtodo Classe derivada que implementa o mtodo Print() novamente Prof. Leonardo Barreto Campos 29/50 Polimorfismo C++ Demais classes derivadas que tambm implementam o mtodo Print() novamente Prof. Leonardo Barreto Campos 30/50 Polimorfismo C++ Matriz de ponteiros para a classe Base Objetos das classes Derivadas Ponteiros recebendo os endereos de cada um dos elementos objetos Execuo da funo Print() dependendo do contedo de p[i] e no do seu tipo Prof. Leonardo Barreto Campos 31/50 Polimorfismo C++ Sada no console do programa anterior: Prof. Leonardo Barreto Campos 32/50 Polimorfismo C++ Caso retirssemos a palavra-chave virtual da funo Print() o compilador iria ignorar o contedo de p[i] e usa o tipo do ponteiro para identificar o mtodo a ser chamado, vejamos: Prof. Leonardo Barreto Campos 33/50 Funes Virtuais Puras C++ Faz sentido termos um mtodo virtual com corpo? No!!! Dessa forma, temos a funo virtual pura que no tem bloco de cdigo; Para criar uma funo virtual pura basta usar o operador de atribuio seguido de um zero aps o seu prottipo: Prof. Leonardo Barreto Campos 34/50 Exerccio C++ Exerccio: 1) Implemente, em C++, uma classe abstrata de nome Paciente com um atributo char Nome[40] e dois mtodos: void GetNome() void Print() 2) Crie um classe derivada de Paciente de nome Assegurado: cujas instncias so caracterizadas pelos atributos char Seguradora[40] e int NumSeguro; Implemente na classe Assegurado o mtodo Print() herdado de Paciente e GetSeguro() para obter os atributos (dados) da classe; Prof. Leonardo Barreto Campos 35/50 Exerccio C++ Exerccio: 3) Crie um classe derivada de Paciente de nome NaoAssegurado: cujas instncias so caracterizadas pelos atributos float Consulta, int Banco e int Cheque; Implemente na classe NaoAssegurado o mtodo Print() herdado de Paciente e GetValor() para obter os atributos (dados) da classe; 4) Elabore um programa de teste onde declarado um array, de dimenso 100, do tipo Paciente. Nesse array devem ser guardadas instncias de Assegurado e NaoAssegurado a partir de uma seleo inicial (if). Aps o usurio optar em no incluir mais pacientes, o programa de teste deve imprimir a relao de pacientes cadastrados; Prof. Leonardo Barreto Campos 36/50 Exerccio - C++ Prof. Leonardo Barreto Campos 37/50 Exerccio - C++ Prof. Leonardo Barreto Campos 38/50 Exerccio - C++ Prof. Leonardo Barreto Campos 39/50 Exerccio C++ Prof. Leonardo Barreto Campos 40/50 Classe-Base Virtual Alm de declararmos funes virtuais, podemos usar a palavra-chave virtual para declarar uma classe inteira; Base Pai Derivada1 Filho1 Derivada2 Filho2 SuperDerivada Neto Prof. Leonardo Barreto Campos 41/50 Classe-Base Virtual O trecho do programa seguinte mostra o erro de ambigidade caso a palavra-chave virtual no seja usada: Prof. Leonardo Barreto Campos 42/50 Classe-Base Virtual A soluo simples e evita o erro de ambigidade, vejamos: Prof. Leonardo Barreto Campos 43/50 Classes Amigas Alm de ser possvel declararmos funes independentes como amigas, podemos declarar uma classe inteira como amiga da outra; Nesse caso, os mtodos da classe ser todos amigos da outra classe; Ou seja, os mtodos tero acesso parte privada ou protegida da outra classe. Prof. Leonardo Barreto Campos 44/50 Classes Amigas Vejamos um exemplo de classes amigas (Tempo e Data): Prof. Leonardo Barreto Campos 45/50 Classes Amigas Vejamos a classe Data: Acesso dados privados da classe Tempo. Prof. Leonardo Barreto Campos 46/50 Classes Amigas Continuao da classe Data: Prof. Leonardo Barreto Campos 47/50 Classes Amigas Programa teste: Sada no Console: Prof. Leonardo Barreto Campos 48/50 Aprenda Java com o BOPE Prof. Leonardo Barreto Campos 49/50 Aprenda Java com o BOPE Prof. Leonardo Barreto Campos 50/50 Bibliografia Mizrahi, Victorine Viviane. Treinamento em C++, mdulo 2. 2 ed. So Paulo: 2006. Deitel, H. M. & Deitel, P. J. C++: como programar, Editora Bookman. 3 ed. Porto Alegre: 2001. Deitel, H. M. & Deitel, P. J. Java: como programar, Editora Bookman. 6 ed. So Paulo: 2005.