Polimorfismo e seus tipos

Por: Trigo

Polimorfismo: basicamente significa que tipos diferentes de objetos respondem a uma mesma mensagem de maneiras diferentes. Seus tipos são:

A) Universal: é universal, ou seja, pode ser aplicado em diversos casos, trabalhando potencialmente num conjunto infinito de tipos de modo disciplinado. Pode ser de dois tipos:

   a1)  Paramétrico: No polimorfismo paramétrico, a definição de um elemento por si só é incompleta, ela precisa parametrizar o tipo para que ele exista. Por exemplo, uma List sozinha não representa nada, ela precisa ser declarada com um tipo, como List<String> por exemplo. Funções paramétricas também são chamadas de funções genéricas. Em Java seu uso se dá com o Generics.
         Exemplo:

              class Lista<E> {                      
                     public void add(E elemento) { // }  

                     public E get(int index) { // }  
              } 
              …
             
              Lista<String> listaString = new Lista<String>();  
              Lista<Integer> listaInteira = new Lista<Integer>();

 

   a2)  Inclusão: É o polimorfismo básico, quando uma classe Pai aponta para um objeto da classe Filho.
          Exemplo:
            

              class Animal{ }
              class Mamifero extends Animal {}
              class Ave extends Animal {}
              …
              Animal a1 = new Mamifero();
              Animal a2 = new Ave();
 

B) Ad-Hoc: É  uma forma limitada de polimorfismo. Ele é implementado quando queremos definir algo especifico. Diferentemente do universal, ele não pode ser usado em todo lugar. Pode ser de dois tipos:

   b1)  Coerção: é  meio para contornar a rigidez dos tipos monomórficos. Existe um mapeamento interno entre os tipos.
         Exemplo:

              Se o operador soma é definido como tendo 2 parâmetros reais e um inteiro e um real são passados como parâmetros, o inteiro é “coargido” para um real.

 

   b2)  Sobrecarga: possibilita termos mais de um método com o mesmo identificador, mas eles devem ter parâmetros diferentes.
          Exemplo:
            

              void somar(int x, int y){ … }
              void somar(float x, float y){ … }

 

Trigo

Formado em engenharia da computação pela Universidade de Pernambuco (UPE), possui mestrado em engenharia da computação pelo Instituto Tecnológico da Aeronáutica (ITA). Atualmente trabalha como oficial do quadro de engenheiros da Força Aérea Brasileira e é professor de disciplinas de tecnologia da informação na faculdade UNEB em Brasília. Possui interesse em algoritmos, gerência de projetos, inteligência artificial e visão computacional, tendo publicado artigos nessas áreas em congressos nacionais e internacionais. É certificado Java (SCJP) e ITIL v3 Foudantions. Últimas nomeações: SERPRO 2008 - Analista de Desenvolvimento de Sistemas EAOEAR 2010 - Oficial do Quado de Engenharia