Acessar método de classe instanciada em Classe Pai de Classe atual;

4 respostas
H

Opa, é o seguinte, desculpem se o titulo ficou meio confuso. Mas então, estou com o seguinte problema, estou em meio a um “projetinho” aqui e vou tentar explicar bem.

Tenho a Classe “Start” que é a ‘main’.
A Classe ‘Jogo’ que é instanciada pela ‘Start’.
A Classe ‘Personagem’ que é abstrata.
E a Classe ‘Heroi’ que herda a ‘Personagem’.

Na classe Jogo eu tenho um metodo que executa um tipo de sorteio que chama outra classe que seguindo em frente forma um Factory; Mas talvez não precise explicar tudo. Mas então, eu no meio da implementação percebi que minha Classe final do Factory não estava alterando a Classe Heroi que ela deveria setar. Resumi o problema com a criação de outra classe teste sem a Factory, e o problema persistiu. Enfim, expliquei por completo pra quer talvez possam entender pq eu nao instancio logo na main tudo e etc…

Em código ta assim:

public class Jogo {

	public static void main(String[] args) {
		Heroi h = new Heroi();
		Masmorra m = new Masmorra();
		acesso a = new acesso();
		// m.inicio();

		m.teste();
		m.set(56);
		m.teste();
		m.set(34);
		m.teste();
		a.setAcesso();
		m.teste();

	}

}
public abstract class Personagem {
	
        private String nome;
	private int nivel;
	private int vida;
	private int ataque;
	
	public Personagem(String nome, int nivel, int vida, int ataque){
		this.nome = nome;
		this.nivel = nivel;
		this.vida = vida;
		this.ataque = ataque;
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getNivel() {
		return nivel;
	}
	public void setNivel(int nivel) {
		this.nivel = nivel;
	}
	public int getVida() {
		return vida;
	}
	public void setVida(int vida) {
		this.vida = vida;
	}
	public int getAtaque() {
		return ataque;
	}
	public void setAtaque(int ataque) {
		this.ataque = ataque;
	}
}
public class Heroi extends Personagem{
	
	public Heroi(){
		super("Heroi", 1, 10, 1);
	}
}
public class Masmorra{

	//GameObject game;
	Heroi heroi = new Heroi();
	//Monstro monstro = new Monstro();
	
	public void teste(){
		System.out.println(heroi.getAtaque());
	}
	public void set(int n){
		heroi.setAtaque(n);
	}
}
public class acesso extends Masmorra {

	public void setAcesso(){
		heroi.setAtaque(9);
		teste();
		set(89);
		teste();
	}
}

Pronto, tipo, não existe erro ao dar Run, apenas a saida não é esperado. A saida esta sendo essa:

1 //valor instanciado no metodo construtor super();
56 // valor setado diretamente pelo objeto instanciado no main
34 // novo valor setado no main
9 // valor setado pela classe 'acesso'
89 //novo valor setado pela classe 'acesso'
34 // agora o problema, esse é  o imprimir do ultimo valor do 'Ataque', ele imprime o ultimo setado pelo main, e não o setado pela classe 'acesso'.

Na verdade não quero instancia nada na classe main, apenas o ‘Masmorra’ então eu instancio o ‘Heroi’ dentro do ‘Masmorra’ e todas classes que extends de ‘Masmorra’ consegue dar “heroi.setAtaque”. BLZ! Entretanto, quando vou utilizar os dados do ‘Heroi’ em outra ação ele ainda está " 1 " que é o valor do construtor, e não o valor que a classe que herda Masmorra setou!

Espero não ter metido pés pelas mãos tentando explicar!

Se precisar posto o codigo original do projeto, ou seja, com Factory, a ideia em si e etc…

4 Respostas

fabiocortolan
O problema é q vc está criando 3 instâncias d Heroi e está querendo que a segunda instancia utilize os valores setados pela terceira, isso não vai funcionar. Vc deve passar a instância de um objeto para outro ou então utilizar apenas a instância da classe Acesso.
public class Jogo {  
  
    public static void main(String[] args) {  
        // Heroi h = new Heroi(); - Cria uma instância e até agora não usou p/ nada
        // Masmorra m = new Masmorra(); - Cria outra instância de Heroi dentro da classe Masmorra
        // acesso a = new acesso(); - Ao criar um novo acesso vc está instanciando novamente a classe Heroi
        // Se precisar utilizar polimorfismo faça
        Masmorra m = new acesso();
        // Caso contrário apenas isso já deve resolver
        acesso a = new acesso();
        // m.inicio();  
  
        // O restante abaixo vc deve mudar conforme a escolha acima (m ou a)
        m.teste();  
        m.set(56);  
        m.teste();  
        m.set(34);  
        m.teste();  
        a.setAcesso();  
        m.teste();  
  
    }  
}
H

E se eu quiser apenas no main instanciar o Masmorra, e dentro de Masmorra instanciar o Heroi, e assim por seguinte eu quero setar valores do Heroi com Classes que Herdam de Masmorra.

Tipo

public class Jogo {

	public static void main(String[] args) {

		Masmorra m = new Masmorra();
public class Masmorra{

	Heroi heroi = new Masmorra();
}
public class acesso extends Masmorra {

	public void setAcesso(){
		heroi.setAtaque(9);
	}
}

Eu ja fiz dessa forma, porem ele acesso seta o valor pra 9 porem, se eu der um “imprime” depois ele me mostra o valor instanciado pelo construtor do Heroi, sendo que eu setei após instanciar ele no Masmorra.

fabiocortolan

Nesse caso vc terá q passar a instância de Heroi para o objeto instanciado es:

Masmorra m = new Massmora();
m = new Acesso(m.getHeroi());

Nesse caso vc consegue pegar a instância de Heroi na classe acesso.

fabiocortolan

Só uma dica, dá uma estudada em Orientação a Objetos, vai te ajudar muito nesses casos.

Criado 19 de maio de 2013
Ultima resposta 20 de mai. de 2013
Respostas 4
Participantes 2