Rogerio Lacerda wrote:
> 
> tenho mais uma duvida, qto ao polimorfismo...
> 
> alguem tem uma definicao para isso ?
> 
> algum exemplo teorico e pratico com Java ?
> 
> agradeco aos participantes,
> 
> Roger
> 

(sorry, mas esse e-mail eh looooongo, ja que parece que ninguem
soube explicar direito o que eh polimorfismo...)

Acho que esta acontecendo um pouco de confusao entre dois conceitos
diferentes: polimorfismo e method overloading. O primeiro 
(polimorfismo) eh algo essencial para a orientacao a objetos, o
segundo (method overloading) eh apenas uma facilidade.

Vou tentar explicar o melhor possivel, mas sugiro a leitura de
um bom livro de OO.

Primeiro o mais simples: method overloading. (uma boa traducao
seria sobrecarregamento de metodos? nao sei qual eh a mais usada).

Methos Overloading eh quando voce tem mais de um metodo no objeto
com o mesmo nome e parametros diferentes. Por exemplo, na classe
java.lang.Integer, temos varios overloadings:

        getInteger(String nm);
        getInteger(String nm, int val);
        getInteger(String nm, Integer val);

        toString();
        toString(i);
        toString(int i, int radix);

alem desses, temos ainda:

        valueOf (2 metodos)
        compareTo (2 metodos)
        parseInt (2 metodos)

Para a linguagem, isso eh apenas uma forma mais elegante de
nomear metodos similares, mas SAO METODOS DIFERENTES. Voce poderia
chama-los de por exemplo:

        getIntegerPassandoString(String nm);
        getIntegerPassandoStringEInt(String nm, int val);
        getIntegerPassandoStringEInteger(String nm, Integer val);

(ja da pra notar que overlading ajuda bastante)

Mas nao eh fundamental, eh apenas uma ajuda, ja que para todos os
efeitos SAO METODOS DIFERENTES.

Agora, o mais "enrolado" (e muito mais importante): polimorfismo.

Polimorfismo eh quando dado um determinado metodo, em momento
de execussao eh que se decide qual objeto ira responde-lo. Isso
acontece quando eu tenho um objeto de um tipo que eu utilizo como
um objeto de um supertipo, ou quando eu utilizo uma interface.

Por exemplo:

public interface I {
        public void i1();
        public void i2();
}

public class A implements I {
        public void i1() {
                //faz algo
        }
        public void i2() {
                //faz outro algo
        }
}

public class B extends A {
        public void i2() {
                //faz outro algo diferente
        }
}

Quando eu crio alguns objetos:

        I i1 = new A(); // objeto A tratado como tipo I
        I i2 = new B(); // objeto B tratado como tipo I
        A a1 = new A();  // objeto A tratado como tipo A
        A b2 = new B();  // objeto B tratado como tipo A

E depois os utilizo:

        i1.i2();
        i2.i2();
        a1.i2();
        a2.i2();

Pense um pouco e tente dizer quais sao os metodos realmente chamados.
O resultado seria:

        i1.i2();
                //faz outro algo
        i2.i2();
                //faz algo diferente
        a1.i2();
                //faz outro algo
        a2.i2();
                //faz outro algo diferente

Observe que mesmo tendo dois objetos do tipo "A" (a1 e a2), os 
resultados sao diferentes. So em momento de execussao eh que eu
vou saber qual o metodo que realmente sera chamado. 
Um outro exemplo de como isso eh importante pode ser:

        I i = null;
        A a = null;
        if (Math.random() < 0.5) {
                i = new A();
                a = new A();
        } else {
                i = new B();
                a = new B();
        }

        i.i2();
        a.i2();

O codigo acima dara diferentes resultados a cada execussao, pois
o metodo i2 sera chamado as vezes em um objeto do tipo B, e outras
em um objeto do tipo A, e voce nao tem como saber qual objeto
ira responder.

Um exemplo ainda mais interessante seria o seguinte metodo:

        public void executaI2(I objeto) {
                objeto.i2();
        }

Com isso, eu nem sei que objeto eu vou receber. Qualquer um
dos exemplos abaixo eh valido, e eu nao sei (em tempo de
compilacao do codigo acima) que metodo vai ser efetivamente
chamado:

        I ib = new B();
        I ia = new A();
        executaI2(ia);
        executaI2(ib);
        executaI2(new A());
        executaI2((A)ib);
        
(como exercicio, faca as chamadas corretas :o)

Pergunta para testar seus conhecimentos:

        O codigo:

                I i = new B();
                (A)i.i2();

        Vai executar que metodo?
        
Como nao tenho nenhum livro de OO para copiar uma boa definicao de
Polimorfismo, vou tentar explicar com minhas proprias palavras.

Polimorfismo eh a capacidade de diferentes objetos de uma hierarquia
de responderam a uma mesma mensagem (ou seja, um MESMO metodo) de 
forma  diferente. Dessa forma voce garante um melhor processo de 
abstracao no seu codigo.

Polimorfismo eh a base para Heranca e para Interfaces (no caso de
Java). Ou seja, polimorfismo (ao contrario de overloading), eh
fundamental para uma linguagem OO.

Resumindo: method overloading (o que todo mundo chamou de
polimorfismo) sao chamadas de metodos DIFERENTES, enquanto
Polimorfismo a chamada eh para metodos IDENTICOS.

Nao sei se ficou confuso. Qualquer coisa, pergutem mais na lista
e eu tento esclarecer. Mais uma vez, desculpem o e-mail gigante,
mas esse conceito eh importante, pois eh a base de OO, e a base
de uma das coisas mais importantes da linguagem Java: Interfaces.
Se voce nao programa com interfaces, saiba que esta provavelmente
programando mal. E se voce nao entende polimorfismo, nao tem como
entender qual a gigantesca importancia que interfaces tem no
seu codigo.

Abracos,

Bruno.
______________________________________________________________________
Bruno Peres Ferreira de Souza                         Sun Microsystems
System Engineer - Java Technologist         [EMAIL PROTECTED]
        if I fail, if I succeed, at least I live as I believe
* Para n�o receber mais e-mails desta lista envie um e-mail para 
[[EMAIL PROTECTED]]
e no corpo do email escreva [unsubscribe <seu-email>]
Veja as mensagens antigas em http://www.mail-archive.com/javabr%40cits.br/

Responder a