Objeto dinamico

6 respostas
S

Olá galera!

Gostaria de saber como posso fazer para acessar um objeto dinamico …:
explico :

eu tenho um objeto do tipo Corpo chamado ouro e outro chamado ferro …

Corpo ouro = new Corpo();
Corpo ferro = new Corpo();

depois tenho uma variavel do tipo String q acumula um nome …
por exemplo

if(alguma coisa)

corpoAtual = ouro;

else

corpoAtual = ferro;

como posso acessar um determinado objeto pela string corpoAtual …

nao consigo fazer simplesmente

Corpo aux = (Corpo)corpoAtual;

aux.mover();

como posso fazer ??

valeu !!

6 Respostas

urubatan

por que você não guarda todos os objetos Corpo criados em um HashMap??

por exemplo

HashMap m = new HashMap();

Corpo ferro = new Corpo();

m.put(ferro,ferro);

Corpo ouro = new Corpo();

m.put(ouro,ouro);
if(alguma coisa)

corpoAtual = ferro;

else

corpoAtual = ferro;

Corpo aux = m.get(corpoAtual);

urubatan

Ops, pequeno erro no meu codigo na ultima linha :slight_smile:

HashMap m = new HashMap();
Corpo ferro = new Corpo();
m.put("ferro",ferro);
Corpo ouro = new Corpo();
m.put("ouro",ouro);


if(alguma coisa)
corpoAtual = "ferro";
else
corpoAtual = "ferro";


Corpo aux = (Corpo)m.get(corpoAtual);

tinha esquecido do cast :slight_smile:

Elvis.The.Pelvis

Spyman, o problema é que você parece ainda está confuso com os conceitos de orientação a onjetos.

Corpo ouro = new Corpo(); //Cria uma instancia de Corpo, referenciada por ouro
Corpo ferro = new Corpo(); //Cria uma instancia de Corpo, referenciada por ferro

Sua memória ficaria ± assim.

ouro ---referencia aponta para o objeto---> +-------+
                                            |Corpo  |
                                            +-------+

ferro ---referencia aponta para o objeto---> +-------+
                                             |Corpo  |
                                             +-------+

Isso significa que você tem dois objetos criados na memória. Esses objetos são do tipo Corpo e cada um tem uma referência apontando pra eles.

Quando você faz:

if (alguma coisa) {
  corpoAtual = "ouro"; 
} else {
  corpoAtual = "ferro";
}

Sua memória passa a ser
ouro ---referencia aponta para o objeto---> +-------+
                                            |Corpo  |
                                            +-------+

ferro ---referencia aponta para o objeto---> +-------+
                                             |Corpo  |
                                             +-------+

corpoAtual ---referencia aponta para o objeto---> +--------+
                                                  |String  |
                                                  +--------+
                                                  O conteudo pode ser "ferro"
                                                  ou "ouro", dependendo do if...

Quando você tenta

[Code]
Corpo aux = (Corpo)corpoAtual;
/Code]

O que a linguagem faz é:
1 - Existe uma referência chamada corpoAtual, que aponta para um objeto do tipo String
2 - Do lado esquerdo da operação, existe uma referencia chamada aux
que aponta para um objeto do tipo Corpo
3 - O Java tenta converter a referencia corpoatual, que é uma String, para um objeto do tipo Corpo.
4 - Só que String e Corpo não tem nada em comum. São objetos completamente diferentes. O compilador acusará erro.

Esses conceitos de orientação a objetos precisam ser entendidos. Não sei se pude ajudar. Explicar isso é meio complicado pra mim.

A solução do HashMap funciona bem legal, pois você associa um objeto através de um identificador. Mas estude os conceitos de OOP. Eles são extremamente importantes.

Rafael_Steil

Outra coisa que voce pode fazer eh criar a instancia dinamicamente. Por exemplo, voce guarda o nome da classe em uma String e utiliza essa String para criar a instancia:

...
String classe = "Corpo";

Corpo ouro = (Corpo)Class.forName(classe).newInstance();
// ..

Rafael

Paulo_Silveira

soh um comentario a parte

a explciacao do elvis nao poderia ser mais completa!

S

:lol:
valeu galera !!

a ideia do Hash foi perfeita …

[]'s

Criado 16 de janeiro de 2003
Ultima resposta 16 de jan. de 2003
Respostas 6
Participantes 5