动态对象变量创建基于对象访问它们

时间:2014-05-06 00:07:36

标签: java class object minecraft extends

我试图为扩展我的主类(BlockOre.java)的每个类执行类似的代码块。我要问的代码是针对Minecraft mod,但问题只是关于Java,而不是我的世界。在我的主要课程中,我创建了三个新的" Block"对象。

public static Block AluminumOre = new BlockAluminumOre();
public static Block VibraniumOre = new BlockVibraniumOre();
public static Block PoloniumOre = new BlockPoloniumOre();

每个块的类扩展了我的类BlockOre。在我的BlockOre类中,我希望拥有这些块的所有类似重复功能。

@SideOnly(Side.CLIENT)
public IIcon iconOre;
@SideOnly(Side.CLIENT)
public IIcon iconNetherOre;
@SideOnly(Side.CLIENT)
public IIcon iconEndOre;
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister){
    iconOre = iconRegister.registerIcon(Reference.MODID + ":EndAluminumOre");
    iconNetherOre = iconRegister.registerIcon(Reference.MODID + ":NetherAluminumOre");
    iconEndOre = iconRegister.registerIcon(Reference.MODID + ":AluminumOre");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int metadata ){
    int dim = Minecraft.getMinecraft().theWorld.provider.dimensionId;
    if (dim == -1)
        return iconNetherOre;
    else if(dim == 0)
        return iconOre;
    else if(dim == 1)
        return iconEndOre;
    else
        return iconOre;

}

我希望他们能做什么。我需要创建这些新的图标,注册它们,然后将它们返回到将获取块的纹理的函数。我只有非常基本的java知识,似乎无法弄清楚如何根据继承类的内容来更改所有对象。

所以更简单地说,我需要iconOre = icon(x)Ore,其中x =扩展此类的类。

聚苯乙烯。我知道我可以使用"这个"得到对象。我也需要更改字符串,如何正确格式化this.toString()。它返回[Object] @XXXXXXXX,具体取决于内存中的位置。正确的吗?

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个扩展BlockOre并包含您需要检索的名称的泛型类,例如:

public class GenericBlockOre extends BlockOre
{
    final String name;

    @SideOnly(Side.CLIENT)
    public IIcon iconOre, iconNetherOre, iconEndOre;

    public GenericBlockOre(final int id, final String name)
    {
        super(id);
        this.name = name;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister iconRegister)
    {
        iconOre = iconRegister.registerIcon(Reference.MODID + ":End" + this.name + "Ore");
        iconNetherOre = iconRegister.registerIcon(Reference.MODID + ":Nether" + this.name + "Ore");
        iconEndOre = iconRegister.registerIcon(Reference.MODID + ":" + this.name + "Ore");
    }
}

你的物品将成为:

public static Block aluminumOre = new GenericBlockOre(1, "Aluminum");
public static Block vibraniumOre = new GenericBlockOre(2, "Vibranium");
public static Block poloniumOre = new GenericBlockOre(3, "Polonium");

或者如果你真的需要创建一个新类,扩展类可以简单如下:

class AluminumOre extends GenericBlockOre
{
    public AluminumOre()
    {
        super(1, "Aluminum");
    }
}

N.B。显然,您无法使用123作为您的块ID,需要进行更改。

然而,如果你绝对肯定它必须是通用的并且你愿意为它牺牲你的mod的效率,你可以这样做以便从类中获得矿石名称:

final AluminumOre ore = new AluminumOre();

final String className = ore.getClass().getSimpleName();
final String oreName = className.substring(0, className.indexOf("Ore"));
System.out.println(oreName); //Prints: Aluminum