"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>.

Responder a