"Bruno F. Souza" wrote:
> 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.
S� para completar acho que concordo apenas com a defini��o; overloading � "apenas
uma forma mais elegante de nomear metodos similares" mas seus benef�cios ultrapassam
sua defini��o.
Dependendo da abordagem(linguagem) ele � fundamental para produzir "bom" c�digo. Em
C++ onde
podemos ainda sobrecarregar operators, overloading � fundamental para atingir boas
implementa��es.
Imaginem por exemplo a sobrecarga de operadores +,=, etc para classes C++.
soma(a,b) ao inves de a + b
atribui(a,c) ao inves de a=c;
// nada conveniente - clareza ?, uniformidade ? performance ?, transparencia ?
reusabilidade ?
Ainda overloading em C++ n�o est� ligado apenas em metodos com mesmo nome e
parametros diferentes!
Em C++ por exemplo � poss�vel ter isso:
char& fa(a int); // overloading em const
const char& fa(a int) const;
Um artif�cio para invocar de maneira transparente m�todos em objetos const e n�o const.
S�o apenas alguns exemplos....
Overloading embora n�o seja um dos pilares da orienta��o a objetos � "fundamental" em
determinados contextos.
Seu uso d� uniformidade,clareza, performance,poder, e flexibilidade(customiza��o) ao
seu c�digo.
Abra�os,
Fred.
>
>
> 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 nao receber mais e-mails da lista, acesse
><http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu e-mail, escolha
>a lista <[EMAIL PROTECTED]> e de um <submit>.
--
Frederico Charles S. Faria
Especialista em Sistemas
INATEL - PRODEP
Fone/Phone: +55 35 471-9280
* Para nao receber mais e-mails da lista, acesse
<http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu e-mail, escolha a
lista <[EMAIL PROTECTED]> e de um <submit>.