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