java如何使一个对象属于字符串中指定的类?
我有一款运行在类似terraria或minecraft等游戏系统上的游戏,至少在方块方面是如此
我构建它的方式是,每个块都是一个对象,每种类型的块都有一个特定的类(扩展了BlockObject原型)
我让游戏将方块保存在如下文件中
我获取要保存的对象实例的名称,并将其存储在字符串中 我开始将给定对象的信息写入一个具有类名称的字符串中(表示它是什么类型的块,例如BlockGrass.java对象的块将存储为BlockGrass)。 通常,当从保存文件中读取信息时,我正在读取保存文件,当它获取块的信息时,它首先将块类型保存在本地字符串中(本例中为BlockGrass),还保存位置(x cordinate和y cordinate)。然后它将运行一系列if语句,如下所示
if(blockType.equals("BlockGrass"))
{
blocksArray.add(new BlockGrass(...));
}
else if(blockType.equals("BlockStone"))
{
blocksArray.add(new BlockStone(...));
}
etc
现在我想让我的游戏动态变化,这样如果有人决定创建一个新的块类(修改游戏),他们就不必修改MapReader类。因此,我不想像上面那样运行一系列if语句(每次创建一个新的块类时,必须为该块放置一个新的if语句),而是希望它生成一个与块类型同名的类的新对象。为了让你有一个更好的想法,请看以下内容
BlocksArray.add(new blockType(...));
上面显示的内容不起作用的原因是,blockType是一个字符串,其中包含我要使用的类的名称。不是类名
我怎么能做那样的事?,不使用if语句
# 1 楼答案
您试图做的是利用BlockObject层次结构中的多态行为。因此,使用
class.forName
是一种很好的方法。在类变量上调用newInstance()
后,需要将其强制转换为BlockObject类层次结构的基类(您称之为原型)。We保证,因为真正的类是扩展BlockObject的,所以根据继承的定义,它是一个BlockObject下面是一个例子
在此类对象上调用的基类的任何方法都将显示多态行为