UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng. da Computação IF62C - Fundamentos de Programação Semana 10 – parte III: Polimorfismo Prof.a Tânia Preto / Prof. Robinson Vida Polimorfismo – Características (i/ii) Polimorfismo é um termo proveniente do grego e significa "muitas formas“; O polimorfismo não é um pensamento novo para o ser humano pois está contido no dia a dia, principalmente na linguagem. Exemplos: Seja o termo “abrir” e as seguintes situações: Abrir uma porta; Abrir uma caixa; Abrir uma janela; Abrir uma conta bancária. Obs.: A ação de abrir vai ser executada de diferentes formas de acordo com a situação. O termo abrir é polimórfico, ou seja, possui várias formas ou “facetas”, cada uma executada de uma maneira. Polimorfismo – Características (ii/ii) No contexto da programação, o polimorfismo permite a existência de métodos de mesmo nome contendo códigos diferente selecionado por algum mecanismo automático; Ideia básica:“Um nome e vários comportamentos”; Vantagens: É possível controlar todas as formas de uma maneira mais simples e geral, sem ter que se preocupar com cada objeto especificamente; Independência da implementação, enxerga-se apenas uma o nome do método; O polimorfismo permite a adaptação e compreensão de um sistema sem existir a necessidade de alterar substancialmente o que já existe. Polimorfismo – Tipos (i/ix) Vários tipos (taxonomias) para polimorfismo: Polimorfismo – Tipos (ii/ix) O polimorfismo pode ocorrer das seguintes formas: Polimorfismo ad-hoc - sobrecarga: Métodos com mesmo nome, funcionalidades similares na mesma classe; Para sobrecarregar um método é necessário criar diferentes definições de métodos na sua classe, todos com o mesmo nome, mas com diferentes parâmetros (número de argumentos ou tipos); A utilização será de acordo com o tipo dos parâmetros que lhes são passados; Ex.: diferentes métodos adição() : int addition (int, int): soma de inteiros float addition (float, float): soma de reais char addition (char, char): concatenação Polimorfismo – Tipos (iii/ix) Polimorfismo ad-hoc – sobrecarga – Ex.: O método atualizarDivida pode ter várias formas, de acordo com o parâmetro utilizado, um determinado método é executado. Métodos de mesmo nome estão dentro da mesma Polimorfismo – Tipos (iv/ix) O polimorfismo pode ocorrer das seguintes formas: Polimorfismo ad-hoc – sobrecarga – Ex.: Tipos de parâmetros diferentes Polimorfismo – Tipos (v/ix) O polimorfismo pode ocorrer das seguintes formas: Polimorfismo ad-hoc – sobrecarga – Ex.: Tipos e números de parâmetros diferentes Polimorfismo – Tipos (vi/ix) Polimorfismo ad-hoc - coerção: Meio para contornar a rigidez dos tipos monomórficos; Existe um mapeamento interno entre tipos; Exemplo: Se o operador soma é definido como tendo 2 parâmetros reais e ocorre a passagem de um inteiro e um real são como parâmetros, o inteiro é “coargido” ou “convertido” para um real; Java permite a coerção. Polimorfismo – Tipos (vii/ix) Polimorfismo Universal - herança ( ou inclusão): Redefinição de métodos uma subclasse filha; A redefinição de um método em subclasses herdeiras de uma classe base chama-se especialização; Permite ocultar detalhes das classes especializadas de uma família de um objeto, através de interface comum (classe básica); Ex.: Jogo de xadrez com subclasses rei, rainha, louco, cavaleiro, torre e peão, filhas da classe peça; É possível ter vários métodos movimento (), um em cada classe, realizando o movimento de acordo com a classe do objeto invocado no momento da chamada. Polimorfismo – Tipos (viii/ix) Polimorfismo Universal - herança ( ou inclusão) – Exemplo: Polimorfismo – Tipos (ix/ix) Polimorfismo Universal - paramétrico: Uma única função pode ser aplicada a um conjunto de tipos (sem qualquer relação entre si); Métodos paramétricos também são chamadas de métodos genéricos; Exemplo: Tamanho de um objeto, sendo este objeto de qualquer tipo; Algumas linguagens, como C++, permitem definir templates de funções, usando tipos de dados como parâmetros, como no exemplo seguinte: template <class T> void troca(T& a,T& b) { T temp = a; a = b; b = temp; } T é um tipo genérico, permitindo várias formas de objetos. Polimorfismo – Mais exemplos - 1 O método área pode ser redefinido em cada subclasse; Dependendo de qual classe invoca o método área, será calculado a área do objeto correto; Métodos de mesmo nome podem estar em classes diferentes; Polimorfismo – Mais exemplos - 2 O método área pode ser redefinido em cada subclasse; Dependendo de quem invoca o método área, será calculado a área do objeto correto; Métodos de mesmo nome podem estar em classes diferentes; Polimorfismo – Mais exemplos - 3 Exemplo de sobrecarga do método construaRetang em Java com duas diferentes implementações. Polimorfismo – Mais exemplos - 4 Exemplo de sobrecarga do método construaRetang em Java com mais uma implementação e formas de uso. Polimorfismo – Mais exemplos - 5 Exemplo de sobrecarga do método construaRetang em Java e diferentes formas de uso. Polimorfismo – Mais exemplos - 6 class MinhaClasse { void metodo (short i, short j) { System.out.println("metodo1 - i="+i+" j="+j); } void metodo (int i, int j) { System.out.println("metodo2 - i="+i+" j="+j); } void metodo (long i, long j) { System.out.println("metodo3 - i="+i+" j="+j); } } Exemplo de coerção em Java – métodos com tipos diferentes Polimorfismo – Mais exemplos - 7 Class testaCoercao { static public void main (String Arg[ ]) { MinhaClasse o=new MinhaClasse( ); short s1=1, s2=2; int i1=3, i2=4; long l1=5, l2=6; o.metodo(s1,s2); // não há conversão -> 1o. método o.metodo(s1,i2); // s1 para int -> 2o. método o.metodo(s1,l2); // s1 para long -> 3o. método o.metodo(i1,i2); // não há conversão -> 2o. método o.metodo(i1,l2); // i1 para long -> 3o. método o.metodo(l1,s2); // s2 para long -> 3o. método o.metodo(l1,l2); // não há conversão -> 3o. método } } Exemplo de coerção – conversão de tipos