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/