Método da classe Filho na classe Pai, como?

Olá pessoal, tenho uma classe Pai chamada TotemType e suas classes Filhas, como, por exemplo: ArmorTotem. Na classe ArmorTotem encontra-se um método chamado getPowerGui(); queria acessar ele através da classe Pai. Eu estou usando o Generics para pegar o tipo do Totem, vou mostrar abaixo:

Método getType que retorna a classe Filha de forma correta:

	public <T extends TotemType> T getType(ItemStack icon) {
		for(TotemType type : this.types) {
			if(type.getIcon().getItemMeta().getDisplayName().equalsIgnoreCase(icon.getItemMeta().getDisplayName())) {
				return (T) type;
			}
		}
		return null;
	}

A forma que estou fazendo atual para acessar os métodos da classe Filha:

if(totem.getTotemType() instanceof ArmorTotem) {
ArmorTotem armorTotem = (ArmorTotem) totem.getTotemType();

}

Mas aí fica inviável, por que para cada tipo teria que ir manualmente editar o código… Queria algo mais dinâmico…

Se essa classe pai for abstrata, vc pode criar um método abstrato nela e acessa-lo diretamente, pois isso fará que todas as classes que herdam dela implementem esse método (cuidado: isso vai criar um forte acoplamento com as classes que herdarem dessa classe).

Outra solução seria utilizar uma interface e fazer as classes filhas que precisarem ter esse método (getPowerGui()) implementa-la. Com isso, vc pode verificar se o objeto é do tipo dessa interface e chamar o método diretamente.

1 curtida

Usando a 1º solução: Teria que criar um getType() na classe abstrata pai(sim, desdo começo ela é uma class abstrata) mas aí o retorno dela teria de ser obrigatoriamente a da classe filha e ficaria inviável.

Colocando em código:

// resto dos métodos abstratos
public abstract ArmorTotem getType();

@Edit - 9h17:
O que pensei foi na classe abstrata Pai criar um método envolvendo Generic:

Na declaração da Class: public class TotemType e retornar T no método getType, daria certo? Mas acho que ainda precisaria verificar com o “instanceof”

Nessa parte, totem é uma instância de uma das classes filhas de TotemType? E como é esse método getTotemType() ?

A princípio, acho que uma boa solução seria envolver o uso de interfaces mesmo.

O Objeto Totem representa cada um criado, e o TotemType fica dentro deste Objeto para eu conseguir pegar as informações de cada tipo. O método getTotemType retorna o Objeto TotemType que está dentro do Objeto Totem.

Na parada da Interface, creio que entendi. Seria transformar a classe TotemType em uma interface(atualmente é uma classe abstrata) e reescrever na classe filha tal método. Certo?!

boa tarde, passando para deixar um exemplo do que eu acho que vc está precisando:

Interface

public interface Totem {

    Class<?> getType();

}

Classe que implementa a interface

public class ArmorTotem implements Totem {

    @Override
    public Class<?> getType() {
        return this.getClass();
    }

}

Método main para teste

public class TotemMain {

    public static void main(String[] args) {
        Totem totem = new ArmorTotem();
        System.out.println(totem.getType());
    }

}

Saída no terminal:

class br.com.teste.main.totem.ArmorTotem

Espero que ajude a organização o pensamento pelo menos.

Usando uma classe abstrata seria assim:

public abstract class TotemType {

    public Class<?> getType() {
        return this.getClass();
    }

}

Classe que estende

public class ArmorTotem extends TotemType {

}

Método main para teste

public class TotemMain {

    public static void main(String[] args) {
        ArmorTotem armorTotem = new ArmorTotem();
        System.out.println(armorTotem.getType());
    }

}

Saída no terminal

class br.com.teste.main.totem.ArmorTotem