UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng. da Computação IF62C -...
Transcript of UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng. da Computação IF62C -...
UTFPR – Campus Curitiba - DAELNUTFPR – Campus Curitiba - DAELNCursos de Eng. Eletrônica/Eng. da ComputaçãoCursos de Eng. Eletrônica/Eng. da Computação
IF62C - Fundamentos de ProgramaçãoIF62C - Fundamentos de Programação
Semana 10 – parte III: Polimorfismo
Prof.a Tânia Preto / Prof. Robinson Vida
Polimorfismo – Características (i/ii)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)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)Polimorfismo – Tipos (i/ix)
Vários tipos (taxonomias) para polimorfismo:
Polimorfismo – Tipos (ii/ix)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 – Tipos (iii/ix)
Polimorfismo – Tipos (iv/ix)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)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 – 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 – 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 – Tipos (viii/ix) Polimorfismo Universal - herança ( ou
inclusão) – Exemplo:
Polimorfismo – Tipos (ix/ix)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 - 1Polimorfismo – 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 - 2Polimorfismo – 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 - 3Polimorfismo – Mais exemplos - 3
Exemplo de sobrecarga do método construaRetang em Java com duas diferentes implementações.
Polimorfismo – Mais exemplos - 4Polimorfismo – Mais exemplos - 4
Exemplo de sobrecarga do método construaRetang em Java com mais uma implementação e formas de uso.
Polimorfismo – Mais exemplos - 5Polimorfismo – Mais exemplos - 5
Exemplo de sobrecarga do método construaRetang em Java e diferentes formas de uso.
Polimorfismo – Mais exemplos - 6Polimorfismo – 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 - 7Polimorfismo – 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étodoo.metodo(s1,i2); // s1 para int -> 2o. métodoo.metodo(s1,l2); // s1 para long -> 3o. métodoo.metodo(i1,i2); // não há conversão -> 2o. métodoo.metodo(i1,l2); // i1 para long -> 3o. métodoo.metodo(l1,s2); // s2 para long -> 3o. métodoo.metodo(l1,l2); // não há conversão -> 3o. método
}
} Exemplo de coerção – conversão de tipos