| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 02:23:24
|
peerless
GUJ Master
![[Avatar]](/images/avatar/5b2a8f2b014bb326fd82ee313704e78c.jpg)
Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline
|
Estava eu aqui, lendo um artigo em C++.. quando me bateu uma dúvida ..
Qual a diferença de se fazer isso:
Pessoa p = new Fisica();
invés de:
Fisica f = new Fisica();
Sendo, claro, que: Fisica extends Pessoa
Valeu galera, posso ter viajado um pouco, mas é o sono!
fui!
|
follow me
pitacos
"The most problems that teams face are about communication, and all the others are too." - Dan North
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 06:58:49
|
Naty_Pieza
What is classpath?
Membro desde: 27/10/2006 08:24:43
Mensagens: 6
Offline
|
Eh... tenho a mesmíssima dúvida faz tempo. Tá complicado entender qual é a real utilidade disso. Sei que é por causa do poliformismo... e só isso que sei!
Nesse seu caso, p só vai poder usar os métodos e variáveis encontrados em Pessoa , mesmo ele sendo instanciado como Fisica , não é?
Então, pra mim que sou iniciante no assunto, realmente não parece ter muito sentido... já que é pra somente usar os métodos encontrados na classe Pessoa não seria mais fácil instancia-lo logo como Pessoa ?
Sinto falta de um exemplo mais prático sobre isso nos livros que leio. Quando vão abordar esse tema eles sempre usam o exemplo de um array que pode receber tanto Pessoa como Fisica , mas realmente não consigo entender com esse tipo de exemplo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 09:47:28
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Bom, a primeira utilidade é criar um método que seja útil para qualquer pessoa:
Esse método agora pode ser chamado por uma pessoa física ou jurídica.
No caso de uma declaração direta, haverá vantagem quando você tem uma classe em que os métodos do pai são mais usados, existem diversas implementações filhas, mas essas implementações adicionam pouca funcionalidade. Então, você pode usar essa técnica para trocar de implementação a hora que quiser.
É o caso da classe Lista. Se vocês lembrarem da matéria de estrutura de dados, existem vários tipos de lista: ListaEncadeada, ListaCircular, ListaEstatica, etc. Todas essas listas fazem basicamente a mesma coisa: Permitem adicionar um objeto, retirar um objeto, acessa-lo pelo índice. Por isso, temos a super classe Lista, e as classes filhas ListaEncadeada, ListaCircular, ListaEstatica, etc...
Pois bem, agora imagine que você vai fazer uma classe que usa uma lista de pessoas. Na hora que você analisou o sistema, percebeu que seriam grupos de no máximo 10 pessoas. Então decidiu usar uma lista circular.
Por exemplo, a classe abaixo:
Ok, o tempo passou e a sua classe grupo funciona maravilhasamente bem. Você calcula o valor pago ao grupo facilmente, e retira os maiores do grupo com a mesma facilidade. É o caso dessa classe festa, que está se beneficiando da classe Grupo:
Um belo dia, seu chefe diz que fecharam contrato com outra empresa, e que agora terão grupos maiores de tamanhos iguais a 100, 200 ou até 1000 pessoas!! O tamanho é desconhecido e não tem cabimento aumentarmos nossa fila circular para um tamanho grande para nos garantirmos, pois isso ocuparia muita memória. Surge então a idéia de substituirmos por uma lista encadeada. Afinal listas encadeadas crescem a medida em que adicionamos elementos e nunca tem problemas de memória.
O que acontece com a sua classe?
Bem, já vimos que a fila circular não vai servir mais... Agora, prestem atenção no seguinte. Todos os locais do programa que utilizam o método pegarMaiores, também foram obrigados a utilizar uma ListaCircular. Como no caso da classe festa.
Bem, qual a dificuldade de se trocar para uma lista encadeada? Teríamos que alterar não só a classe Grupo, mas também a classe Festa e todas as outras classes que utilizassem o método pegarMaiores(). A situação seria completamente diferente se tivéssemos feito:
Notem que agora, para trocar o tipo de lista, bastaria irmos para os locais onde as listas são criadas na classe Grupo e trocarmos por uma lista encadeada:
Não é mais necessário alterar a classe festa. Por que? No segundo caso, não criamos nenhum tipo de dependência sobre qual tipo de lista a classe festa receberia. Mesmo porque, para o contexto do sistema, também não interessava. Qual seria, afinal, a utilidade da classe Festa saber que a lista de pessoas é Encadeada ou Circular? Nenhuma.
Para festa, o que interessa é ter uma Lista qualquer de pessoas participantes. Outras classes que utilizassem o método pegaMaiores da classe Grupo também não seriam afetadas, pelo mesmo motivo.
A modificação do sistema é menor, menos traumática, pois ocorre num só ponto (a classe Grupo). Notem também que agora o problema ficou restrito a única classe que foi modelada errada (Grupo) e não ao sistema todo. O fato de termos usado uma lista mais genérica, não fez com que o problema se "espalhasse" para o resto do código (classe Festa).
Em resumo, você fica livre para escolher a implementação que quiser, a hora que quiser, altera-la no futuro, sem que o resto do sistema seja afetado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 11:13:31
|
peerless
GUJ Master
![[Avatar]](/images/avatar/5b2a8f2b014bb326fd82ee313704e78c.jpg)
Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline
|
então,
o pensamento meu sobre isso.. fica naquela de..
se P é uma nova pessoa FISICA
assim como F tbm é, pois fisica extends pessoa
ou seja.. é a mesma coisa , não?
Viny, vou dar uma estudada no que vc postou!
|
follow me
pitacos
"The most problems that teams face are about communication, and all the others are too." - Dan North
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 11:59:32
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Ok, se ainda tiver dúvida, é só entrar em contato!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 12:48:37
|
fabim
GUJ Master
![[Avatar]](/images/avatar/d4e3e8180a65648886ff348c7a6bbff5.jpg)
Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline
|
Bom, acho que a palavra chave nessa dúvida se chama POLIMORFISMO...
vc tem um metodo que esta declarado em Pessoa, e está sobrescrito (vide diferença entre sobrescrito e sobrecarregado) em PessoaFisica e PessoaJurídica... nao é um exemplo tao bom, pq so existem 2 classes concretas... poderiam haver 20...
O caso é: qdo vc faz Pai = new Herdeiro(), vc está lidando apenas com objetos Pai... qdo vc faz pai.metodo(), em tempo de execução a JVM sabe que, na verdade, aquele "Pessoa"(pai) é na verdade um "PessoaFisica"(herdeiro), ou "PessoaJuridica"(herdeiro)... e vai executar o método que está sobrescrito na classe herdeira...
sacou? é como se a JVM te poupasse de ter q fazer uns testes do tipo
if (Carro instance of Ferrari) (Ferrari)Carro.acelerar();
if (Carro instance of Porshce) (Porsche)Carro.acelerar();
if (Carro instance of Mazda) (Mazda)Carro.acelerar();
if (Carro instance of Fusca) (Fusca)Carro.acelerar(); //deprecated =P
princípio básico de herança...
|
ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται
Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2007 18:29:07
|
omaisnormalbaba
JavaGuru
Membro desde: 27/03/2006 18:45:11
Mensagens: 223
Localização: Passos - Mg
Offline
|
ViniGodoy....
Outra duvida... Na sua classe Grupo ao inves de eu dar :
Eu usar:
Não vai ter o mesmo sentido????
Só que agora eu usei o :
E no metodo que retorna uma filha eu pedi pra retornar pai.
A partir disso que eu disse. Qual a praticidade que eu tenho em
Pai f = new Filha();
Agradeço....
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/03/2007 11:52:17
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
peerless wrote:Estava eu aqui, lendo um artigo em C++.. quando me bateu uma dúvida ..
Qual a diferença de se fazer isso:
Pessoa p = new Fisica();
invés de:
Fisica f = new Fisica();
Sendo, claro, que: Fisica extends Pessoa
Valeu galera, posso ter viajado um pouco, mas é o sono!
fui!
quando vc faz isso:
vc tem acesso ao metodos que foi subscrito da class que está apos =..
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/03/2007 14:13:58
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
omaisnormalbaba wrote:ViniGodoy....
Outra duvida... Na sua classe Grupo ao inves de eu dar :
Não vai ter o mesmo sentido????
Vai ter o mesmo sentido sim. Entretanto, se você começar usar métodos que são específicos da lista encadeada, você não conseguirá trocar a implementação tão facilmente no futuro.
Você só deve declarar assim, se esses métodos forem imprescindíveis para a sua classe. Caso contrário, com esse tipo de classe, é melhor manter o uso genérico, justamente para que a implementação possa ser substituída no futuro.
Referenciando o tipo pelo pai, você tem a garantia de que o Java não deixará você utilizar métodos específicos da classe filha e, portanto, não corre o risco de ter que reescrever alguma coisa.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2007 11:16:53
|
omaisnormalbaba
JavaGuru
Membro desde: 27/03/2006 18:45:11
Mensagens: 223
Localização: Passos - Mg
Offline
|
ViniGodoy wrote:
omaisnormalbaba wrote:ViniGodoy....
Outra duvida... Na sua classe Grupo ao inves de eu dar :
Não vai ter o mesmo sentido????
Referenciando o tipo pelo pai, você tem a garantia de que o Java não deixará você utilizar métodos específicos da classe filha e, portanto, não corre o risco de ter que reescrever alguma coisa.
Valeu... Intão é legal eu fazer desta forma para que eu fique restrito a metodos que são declarados na classe pai e subscritos de acordo com a necessidade na classe filha.... È claro que cada caso é um caso...
|
|
|
 |
|
|