Baixe o app para aproveitar ainda mais
Prévia do material em texto
Introdução ao polimorfismo APRESENTAÇÃO Polimorfismo é um dos quatro pilares da programação orientada a objetos. Polimorfismo deriva do grego “muitas formas”. Em orientação a objetos, seria usar o mesmo método de formas diferentes. Segundo Horstmann Cay (2009), quando múltiplas classes implementam a mesma interface, cada classe implementa os métodos da interface de diferentes maneiras, isto é, cada classe implementa o método de acordo com suas funcionalidades. Nesta Unidade de Aprendizagem estudaremos o polimorfismo e sua aplicação. Bons estudos. Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados: Definir o que é polimorfismo.• Identificar interfaces.• Construir uma aplicação utilizando a prática de polimorfismo.• DESAFIO Você trabalha como analista/programador em uma fábrica de software e foi solicitada a criação de uma calculadora com as quatro operações básicas da matemática - soma, subtração, multiplicação e divisão. Essa calculadora deverá receber apenas dois números de cada vez e a operação desejada. Para construi-la, você deverá fazer o uso de uma interface com um método calcular e quatro classes que implementam esta interface, cada classe correspondente a uma operação. Crie uma classe controle para instanciar as classes das operações. Para executar a tarefa, utilize uma linguagem de programação orientada a objeto. Logo após a criação, exporte o projeto em um arquivo zipado. INFOGRÁFICO Veja no infográfico conceitos de polimorfismo. CONTEÚDO DO LIVRO O polimorfismo permite que você “programe no geral”, em vez de “programar no específico”. Em particular, permite escrever programas que processam objetos que compartilham a mesma superclasse (direta ou indiretamente), como se todos fossem objetos da superclasse; isso pode simplificar a programação. Acompanhe um trecho do livro Android: como programar, o qual serve de base teórica para esta Unidade de Aprendizagem. Inicie seu estudo pelo tópico Introdução ao polimorfismo e finalize no tópico Declarando uma classe abstrata e métodos abstratos. Boa leitura! com introdução a Java Paul Deitel • Harvey Deitel • Abbey Deitel SEGUNDA EDIÇÃO Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094 D324a Deitel, Paul. Android : como programar [recurso eletrônico] / Paul Deitel, Harvey Deitel, Abbey Deitel ; tradução: João Eduardo Nóbrega Tortello. – 2. ed. – Porto Alegre : Bookman, 2015. Editado como livro impresso em 2015. ISBN 978-85-8260-348-2 1. Programação - Android. I. Deitel, Harvey. II. Deitel, Abbey. III. Título. CDU 004.438Android 548 Android: Como Programar G.6 Introdução ao polimorfismo Continuamos nosso estudo sobre programação orientada a objetos explicando e de- monstrando o polimorfismo com hierarquias de herança. O polimorfismo permite que você “programe no geral”, em vez de “programar no específico”. Em particular, o poli- morfismo permite escrever programas que processam objetos que compartilham a mes- ma superclasse (direta ou indiretamente), como se todos fossem objetos da superclasse; isso pode simplificar a programação. Considere o exemplo de polimorfismo a seguir. Suponha que criemos um progra- ma para simular o movimento de vários tipos de animais para um estudo biológico. As classes Peixe, Rã e Pássaro representam os tipos de animais sob investigação. Imagine que cada classe estende a superclasse Animal, a qual contém um método mover e mantém a posição atual de um animal como coordenadas x-y. Cada subclasse implementa o mé- todo mover. Nosso programa mantém um array Animal que contém referências para obje- tos de várias subclasses de Animal. Para simular os movimentos dos animais, o programa envia a cada objeto a mesma mensagem, uma vez por segundo – a saber, mover. Cada tipo específico de Animal responde a uma mensagem mover à sua própria maneira – um Peixe poderia nadar por um metro, uma Rã poderia pular por um metro e meio e um Pássaro poderia voar por três metros. Cada objeto sabe como modificar suas coordenadas x-y apropriadamente para seu tipo específico de movimento. Contar com o fato de que cada objeto sabe como “fazer a coisa certa” (isto é, fazer o que é adequado para esse tipo de objeto) em resposta à mesma chamada de método é o principal conceito do polimorfis- mo. A mesma mensagem (neste caso, mover) enviada para uma variedade de objetos tem “muitas formas” de resultados – daí o termo polimorfismo. Programar no específico Ocasionalmente, ao realizarmos processamento polimórfico, precisamos programar “no específico”. Vamos demonstrar que um programa pode determinar o tipo de um objeto no momento da execução e atuar nesse objeto de forma correspondente. Interfaces O apêndice continua com uma introdução às interfaces Java. Uma interface descreve um conjunto de métodos que podem ser chamados em um objeto, mas não fornece implementações concretas para todos os métodos. Você pode declarar classes que im- plementam (isto é, fornecem implementações concretas para os métodos de) uma ou mais interfaces. Cada método de interface deve ser declarado em todas as classes que im- plementam a interface explicitamente. Quando uma classe implementa uma interface, todos os objetos dessa classe têm uma relação é um com o tipo de interface, e é garantido que todos os objetos da classe fornecem a funcionalidade descrita pela interface. Isso também vale para todas as subclasses dessa classe. As interfaces são particularmente úteis para atribuir funcionalidade comum a clas- ses possivelmente não relacionadas. Isso permite que objetos de classes não relacionadas sejam processados de modo polimórfico – objetos de classes que implementam a mesma interface podem responder a todas as chamadas de métodos da interface de forma perso- nalizada. Para demonstrar a criação e o uso de interfaces, modificamos nosso aplicativo de folha de pagamento para criar um aplicativo de contas a pagar geral que pode calcular os pagamentos devidos aos funcionários da empresa e os valores das faturas a serem cobrados por bens adquiridos. Como você vai ver, as interfaces possiblitam recursos polimórficos semelhantes aos que são possíveis com a herança. Apêndice G Programação orientada a objetos: herança e polimorfismo 549 G.7 Polimorfismo: um exemplo Objetos espaciais em um videogame Suponha que projetemos um videogame que manipula objetos das classes Marciano, Venusiano, Plutoniano, NaveEspacial e RaioLaser. Imagine que cada classe herda da superclasse ObjetoEspacial, a qual contém o método desenhar. Cada subclasse im- plementa esse método. Um gerenciador de tela mantém uma coleção (por exemplo, um array ObjetoEspacial) de referências para objetos das várias classes. Para atualizar a tela, o gerenciador envia periodicamente a cada objeto a mesma mensagem – a saber, desenhar. Contudo, cada objeto responde à sua própria maneira, de acordo com sua classe. Por exemplo, um objeto Marciano poderia desenhar-se em vermelho com olhos verdes e com o número apropriado de antenas. Um objeto NaveEspacial poderia desenhar-se como um disco voador prata luminoso. Um objeto RaioLaser poderia desenhar-se como um feixe vermelho brilhante na tela. Novamente, a mesma mensagem (neste caso, desenhar) enviada para uma variedade de objetos tem “muitas formas” de resultados. Um gerenciador de tela poderia usar polimorfismo para facilitar a inclusão de novas classes a um sistema, com modificações mínimas no código do sistema. Suponha que queiramos adicionar objetos Mercuriano ao nosso videogame. Para isso, construi- ríamos uma classe Mercuriano que estenderia ObjetoEspacial e forneceria sua própria implementação do método desenhar. Quando objetos Mercuriano aparecem na coleção ObjetoEspacial, o código do gerenciador de tela chama o método desenhar, exatamente como faz para qualquer outro objeto da coleção, independentemente de seu tipo. Assim, os novos objetos Mercuriano simplesmente “se conectam”, semqualquer modificação no código do gerenciador de tela por parte do programador. Portanto, sem modificar o sistema (a não ser pela construção de novas classes e a modificação do código que cria novos objetos), você pode usar polimorfismo para convenientemente incluir tipos adi- cionais que não estavam previstos quando o sistema foi criado. Observação sobre engenharia de software G.4 O polimorfismo permite que você lide com as generalidades e deixe o ambiente de tempo de execução tratar dos detalhes específicos. Você pode fazer que os objetos se comportem de maneiras adequadas sem conhecer seus tipos (desde que os objetos pertençam à mesma hierarquia de herança). Observação sobre engenharia de software G.5 O polimorfismo promove a extensibilidade: um software que ativa comportamento polimórfico é independente dos tipos de objeto para os quais as mensagens são enviadas. Novos tipos de objeto que podem responder às chamadas de método já existentes podem ser incorporados a um sistema sem modificar o sistema básico. Somente o código cliente que instancia novos objetos precisa ser modificado para acomodar os novos tipos. G.8 Demonstração de comportamento polimórfico A seção G.4 criou uma hierarquia de classes na qual a classe BasePlusCommissionEmployee herdava de CommissionEmployee. Os exemplos daquela seção manipulavam objetos CommissionEmployee e BasePlusCommissionEmployee usando referências a eles para cha- 550 Android: Como Programar mar seus métodos – apontamos variáveis de superclasse para objetos de superclasse e variáveis de subclasse para objetos de subclasse. Essas atribuições são naturais e simples – as variáveis de superclasse são destinadas a fazer referência a objetos de superclasse, e as variáveis de subclasse são destinadas a fazer referência a objetos de subclasse. Contudo, conforme você vai ver em breve, outras atribuições são possíveis. No próximo exemplo, apontamos uma referência de superclasse para um objeto de subclasse. Então, mostramos como o fato de chamar um método em um objeto de sub- classe por meio de uma referência de superclasse ativa a funcionalidade da subclasse – o tipo do objeto referenciado, não o tipo da variável, determina qual método é chamado. Esse exemplo demonstra que um objeto de uma subclasse pode ser tratado como um obje- to de sua superclasse, permitindo várias manipulações interessantes. Um programa pode criar um array de variáveis de superclasse que se referem a objetos de muitos tipos de sub- classe. Isso é permitido porque cada objeto de subclasse é um objeto de sua superclasse. Por exemplo, podemos atribuir a referência de um objeto BasePlusCommissionEmployee a uma variável da superclasse CommissionEmployee, pois um BasePlusCommissionEmployee é um CommissionEmployee – podemos tratar um BasePlusCommissionEmployee como um CommissionEmployee. Conforme você vai aprender mais adiante neste apêndice, não é permitido tratar um objeto de superclasse como um objeto de subclasse, pois um objeto de superclasse não é um objeto de qualquer uma de suas subclasses. Por exemplo, não podemos atribuir a re- ferência de um objeto CommissionEmployee a uma variável da subclasse BasePlusCommis- sionEmployee, pois um CommissionEmployee não é um BasePlusCommissionEmployee – um CommissionEmployee não tem uma variável de instância baseSalary e não tem métodos setBaseSalary e getBaseSalary. A relação é um se aplica apenas para cima na hierarquia, de uma subclasse para suas superclasses diretas e indiretas, e não vice-versa (isto é, não para baixo na hierarquia, de uma superclasse para suas subclasses). O compilador Java permite a atribuição de uma referência de superclasse para uma variável de subclasse se convertermos explicitamente a referência de superclasse para o tipo da subclasse – uma técnica que discutimos na seção G.10. Por que desejaríamos fazer tal atribuição? Uma referência de superclasse só pode ser usada para chamar os mé- todos declarados na superclasse – chamar métodos exclusivos da subclasse por meio de uma referência de superclasse resulta em erros de compilação. Se um programa precisa efetuar uma operação específica da subclasse em um objeto de subclasse referenciado por uma variável de superclasse, ele deve primeiro converter a referência de superclasse em uma referência de subclasse, por meio de uma técnica conhecida como downcasting. Isso permite que o programa chame métodos de subclasse que não estão na superclasse. Mostramos um exemplo de downcasting na seção G.10. O exemplo da Fig. G.13 demonstra três maneiras de usar variáveis de superclasse e subclasse para armazenar referências para objetos de superclasse e subclasse. As duas primeiras são simples – como na seção G.4, atribuímos uma referência de superclasse a uma variável de superclasse e uma referência de subclasse a uma variável de subclasse. Então, demonstramos a relação entre subclasses e superclasses (isto é, a relação é um), atribuindo uma referência de subclasse a uma variável de superclasse. Esse programa usa as classes CommissionEmployee e BasePlusCommissionEmployee da Fig. G.10 e da Fig. G.11, respectivamente. Apêndice G Programação orientada a objetos: herança e polimorfismo 551 1 // Fig. G.13: PolymorphismTest.java 2 // Atribuindo referências de superclasse e subclasse a 3 // variáveis de superclasse e subclasse. 4 5 public class PolymorphismTest 6 { 7 public static void main( String[] args ) 8 { 9 10 11 12 13 14 15 16 17 18 // chama toString no objeto de superclasse usando variável de superclasse 19 System.out.printf( "%s %s:\n\n%s\n\n", 20 "Call CommissionEmployee's toString with superclass reference ", 21 "to superclass object", ); 22 23 // chama toString no objeto de subclasse usando variável de subclasse 24 System.out.printf( "%s %s:\n\n%s\n\n", 25 "Call BasePlusCommissionEmployee's toString with subclass", 26 "reference to subclass object", 27 ); 28 29 // chama toString no objeto de subclasse usando variável de superclasse 30 31 32 System.out.printf( "%s %s:\n\n%s\n", 33 "Call BasePlusCommissionEmployee's toString with superclass", 34 "reference to subclass object", ); 35 } // fim de main 36 } // fim da classe PolymorphismTest // atribui referência de superclasse à variável de superclasse CommissionEmployee commissionEmployee = new CommissionEmployee( "Sue", "Jones", "222-22-2222", 10000, .06 ); // atribui referência de subclasse à variável de subclasse BasePlusCommissionEmployee basePlusCommissionEmployee = new BasePlusCommissionEmployee( "Bob", "Lewis", "333-33-3333", 5000, .04, 300 ); commissionEmployee.toString() basePlusCommissionEmployee.toString() CommissionEmployee commissionEmployee2 = basePlusCommissionEmployee; commissionEmployee2.toString() Call CommissionEmployee's toString with superclass reference to superclass object: commission employee: Sue Jones social security number: 222-22-2222 gross sales: 10000.00 commission rate: 0.06 Call BasePlusCommissionEmployee's toString with subclass reference to subclass object: base-salaried commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 base salary: 300.00 Call BasePlusCommissionEmployee's toString with superclass reference to subclass object: base-salaried commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 base salary: 300.00 Figura G.13 Atribuindo referências de superclasse e subclasse a variáveis de superclasse e subclasse. 552 Android: Como Programar Na Fig. G.13, as linhas 10 e 11 criam um objeto CommissionEmployee e atri- buem sua referência a uma variável de CommissionEmployee. As linhas 14 a 16 criam um objeto BasePlusCommissionEmployee e atribuem sua referência a uma variável de BasePlusCommissionEmployee. Essas atribuições são naturais – por exemplo, a principal fina- lidade de uma variável de CommissionEmployee é armazenar uma referência para um objeto CommissionEmployee. As linhas 19 a 21 usam commissionEmployee parachamar toString ex- plicitamente. Como commissionEmployee se refere a um objeto CommissionEmployee, é cha- mada a versão de toString da superclasse CommissionEmployee. Do mesmo modo, as linhas 24 a 27 usam basePlusCommissionEmployee para chamar toString explicitamente no objeto BasePlusCommissionEmployee. Isso chama a versão de toString da subclasse BasePlusCom- missionEmployee. Então, as linhas 30 e 31 atribuem a referência do objeto de subclasse basePlusCommissionEmployee a uma variável da superclasse CommissionEmployee, a qual as linhas 32 a 34 usam para chamar o método toString. Quando uma variável de superclasse contém uma referência para um objeto de subclasse e essa referência é usada para chamar um método, é chamada a versão da subclasse do método. Assim, commissionEmployee2.toString() na linha 34 chama na verdade o método toString da classe BasePlusCommission Employee. O compilador Java permite esse “cruzamento” porque um objeto de uma subclasse é um ob- jeto de sua superclasse (mas não vice-versa). Quando o compilador encontra uma chamada de método feita por meio de uma variável, ele determina se o método pode ser chamado verificando o tipo de classe da variável. Se essa classe contém a declaração de método correta (ou herda uma), a chamada é compilada. No momento da execução, o tipo do objeto ao qual a variável se refere determina o método realmente usado. Esse processo, denominado vinculação dinâmica, está discutido em detalhes na seção G.10. G.9 Classes e métodos abstratos Quando pensamos em uma classe, presumimos que os programas vão criar objetos desse tipo. Às vezes, é interessante declarar classes – denominadas classes abstratas – para as quais você nunca pretende criar objetos. Como elas são usadas apenas como superclasses nas hierarquias de herança, nos referimos a elas como superclasses abstratas. Essas clas- ses não podem ser usadas para instanciar objetos, pois, como veremos em breve, as classes abstratas são incompletas. As subclasses devem declarar as “partes ausentes” para se torna- rem classes “concretas”, a partir das quais você pode instanciar objetos. Caso contrário, es- sas subclasses também serão abstratas. Demonstramos as classes abstratas na seção G.10. Finalidade das classes abstratas A finalidade de uma classe abstrata é fornecer uma superclasse apropriada a partir da qual outras classes podem herdar e, assim, compartilhar um projeto comum. Na hie- rarquia Forma da Fig. G.3, por exemplo, as subclasses herdam a noção do que significa ser uma Forma – talvez atributos comuns, como localização, cor e espessuraDaBorda, e comportamentos como desenhar, mover, redimensionar e mudarCor. As classes que po- dem ser usadas para instanciar objetos são denominadas classes concretas. Essas classes fornecem implementações de cada método que declaram (algumas das implementações podem ser herdadas). Por exemplo, poderíamos produzir as classes concretas Círculo, Quadrado e Triângulo a partir da superclasse abstrata FormaBidimensional. Do mesmo modo, poderíamos produzir as classes concretas Esfera, Cubo e Tetraedro a partir da superclasse abstrata FormaTridimensional. As superclasses abstratas são gerais demais para criar objetos reais – elas especificam apenas o que é comum entre as subclasses. Precisa- mos ser mais específicos antes de podermos criar objetos. Por exemplo, se você envia a Apêndice G Programação orientada a objetos: herança e polimorfismo 553 mensagem desenhar para a classe abstrata FormaBidimensional, a classe sabe que formas bidimensionais devem ser desenhadas, mas não sabe a forma específica a desenhar; por- tanto, não pode implementar um método desenhar real. As classes concretas fornecem os detalhes específicos que as tornam adequadas para instanciar objetos. Nem todas as hierarquias contêm classes abstratas. No entanto, muitas vezes você vai escrever código cliente que utiliza apenas tipos de superclasse abstrata para reduzir as dependências do código a um intervalo de tipos de subclasse. Por exemplo, você pode escrever um método com um parâmetro de um tipo de superclasse abstrata. Quando chamado, esse método pode receber um objeto de qualquer classe concreta que estenda direta ou indiretamente a superclasse especificada como tipo do parâmetro. Às vezes, as classes abstratas constituem vários níveis de uma hierarquia. Por exem- plo, a hierarquia Forma da Fig. G.3 começa com a classe abstrata Forma. No nível seguinte da hierarquia estão as classes abstratas FormaBidimensional e FormaTridimensional. O próximo nível declara classes concretas para FormasBidimensionais (Círculo, Quadrado e Triângulo) e para FormasTridimensionais (Esfera, Cubo e Tetraedro). Declarando uma classe abstrata e métodos abstratos Você torna uma classe abstrata declarando-a com a palavra-chave abstract. Normal- mente, uma classe abstrata contém um ou mais métodos abstratos. Um método abstra- to é o que tem a palavra-chave abstract em sua declaração, como em public abstract void draw(); // método abstrato Os métodos abstratos não fornecem implementações. Uma classe que contém quaisquer métodos abstratos deve ser explicitamente declarada como abstract, mesmo que essa classe contenha alguns métodos concretos (não abstratos). Cada subclasse con- creta de uma superclasse abstrata também deve fornecer implementações concretas de cada um dos métodos abstratos da superclasse. Construtores e métodos estáticos não podem ser declarados como abstract. Construtores não são herdados; portanto, um construtor abstrato nunca poderia ser implementado. Embora os métodos estáticos não private sejam herdados, eles não podem ser sobrescritos. Como os métodos abstratos se destinam a ser sobrescritos para que possam processar objetos de acordo com seus tipos, não faria sentido declarar um método estático como abstract. Observação sobre engenharia de software G.6 Uma classe abstrata declara atributos e comportamentos comuns (tanto abstratos como concretos) das várias classes de uma hierarquia de classes. Normalmente, uma classe abs- trata contém um ou mais métodos abstratos que as subclasses devem sobrescrever, caso de- vam ser concretas. As variáveis de instância e os métodos concretos de uma classe abstrata estão sujeitos às regras normais da herança. Usando classes abstratas para declarar variáveis Embora não possamos instanciar objetos de superclasses abstratas, em breve você vai ver que podemos usar superclasses abstratas para declarar variáveis que podem armazenar re- ferências para objetos de qualquer classe concreta derivada dessas superclasses abstratas. Normalmente, os programas usam tais variáveis para manipular objetos de subclasse de forma polimórfica. Também é possível usar nomes de superclasses abstratas para chamar métodos estáticos declarados nessas superclasses. Considere outra aplicação de polimorfismo. Um programa de desenho precisa exibir muitas formas, incluindo tipos de novas formas que você vai adicionar ao sistema 554 Android: Como Programar depois de escrever o programa de desenho. Talvez esse programa precise exibir formas como Círculos, Triângulos, Retângulos ou outras que derivem da classe abstrata Forma. O programa de desenho usa variáveis de Forma para gerenciar os objetos que são exibi- dos. Para desenhar qualquer objeto dessa hierarquia de herança, o programa de desenho usa uma variável da superclasse Forma contendo uma referência para o objeto de sub- classe, a fim de chamar o método desenhar do objeto. Esse método é declarado como abstract na superclasse Forma; portanto, cada subclasse concreta deve implementar o método desenhar de uma maneira específica para essa forma – cada objeto da hierarquia de herança Forma sabe como se desenhar. O programa de desenho não precisa se preocupar com o tipo de cada objeto ou se encontrou objetos desse tipo. Figura G.14 Diagrama de classe em UML da hierarquia Employee. Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na BibliotecaVirtual da Instituição, você encontra a obra na íntegra. DICA DO PROFESSOR Acompanhe no vídeo o uso prático de polimorfismo. Conteúdo interativo disponível na plataforma de ensino! EXERCÍCIOS 1) O polimorfismo é um dos quatro pilares da programação de orientação a objetos. Portanto, marque a opção que melhor descreva o conceito de polimorfismo. A) Quando uma classe herda membros de outra classe. B) Quando uma classe possui métodos abstratos. C) Quando cada classe implementa o mesmo método de diferentes maneiras. D) Quando uma subclasse usa um método da superclasse. E) Quando uma classe possui um ou mais métodos sem retorno. 2) Para podermos entender melhor e trabalharmos com polimorfismo, é de extrema importância sabermos alguns conceitos, como as "Interfaces". Portanto, marque a alternativa que melhor define interfaces em programação orientada a objetos. A) São classes que possuem apenas atributos. B) Interfaces são classes que não podem ser instanciadas. C) Diferentemente de uma classe, um tipo de interface não fornece nenhuma implementação. D) Interfaces possuem variáveis de instância e métodos abstratos. E) Interfaces são classes que possuem métodos que não podem ser implementados por outras classes. 3) Em relação ao polimorfismo, marque a alternativa incorreta. A) O polimorfismo permite que programemos no geral, e não no específico. B) Programar no específico é quando o programa determina o tipo de objeto no momento da execução. C) Para trabalharmos com polimorfismo, podemos herdar métodos de uma superclasse ou implementarmos uma interface. D) A técnica de polimorfismo não permite que alteremos a implementação de um método. E) Novos tipos de objeto que podem responder às chamadas de método já existentes podem ser incorporados ao sistema sem alterar o sistema básico. 4) Qual a relação do polimorfismo com interfaces e superclasses? A) Há polimorfismo quando uma subclasse herda membros de uma superclasse. B) Quando uma classe herda membros de uma interface, ativa um comportamento polimórfico. Quando um método existente em uma interface é usado por uma classe que não altera a C) implementação do método, temos um comportamento de polimorfismo. D) Quando uma classe implementa uma interface, ela se obriga a utilizar e implementar todos os métodos da interface, com isso, temos um comportamento polimórfico. E) Quando uma classe implementa uma interface, não há necessidade de utilizar todos os seus métodos. Entretanto, para que haja um comportamento polimórfico, é necessário implementar os métodos utilizados de acordo com sua necessidade. Analise o código abaixo e marque a alternativa correta. 5) A) O código 1 refere-se à criação de uma classe abstrata. B) O código 2 está incorreto, pois o método locomover pertence à interface "InterfaceTeste". Quando a classe "Formiga" implementou a interface, a mesma alterou a implementação do método. C) O código 3 está escrito de forma correta. D) O código 4 está escrito de forma errada, pois, para utilizarmos uma interface, devemos colocar a palavra-chave implements, não extends. E) Sendo o código 1 a interface, podemos concluir que nos códigos 2, 3 e 4, temos um comportamento polimórfico. NA PRÁTICA Polimorfismo em orientação a objetos refere-se à condição que um método tem de assumir várias formas, isto é, é a utilização de um método com a mesma assinatura, entretanto, executando ações específicas para a classe que o contém. Uma das vantagens do polimorfismo é menor trabalho e mais localizado. Um exemplo clássico é o método print no Java. É chamado em diferentes classes, mas o resultado impresso na tela será de acordo com a necessidade daquela classe. SAIBA MAIS Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor: Conceitos de computação com Java HORSTMANN, C. Conceitos de computação com Java. 5.ed. Porto Alegre: Bookman, 2009. Aula - Polimorfismo Veja um pouco mais sobre polimorfismo no vídeo abaixo. Conteúdo interativo disponível na plataforma de ensino! Java para iniciantes: crie, compile e execute programas Java rapidamente. Confira o livro Java para iniciantes no capítulo 7 (246) a relação de Herança e seu métodos que dão suporte ao polimorfismo.
Compartilhar