【发布时间】:2015-06-14 05:02:42
【问题描述】:
我有一款游戏运行在与 terraria 或 minecraft 类似的系统上,至少在块状方面是这样。
我以每个块都是一个对象的方式构造它,并且每种类型的块都有一个特定的类(扩展 BlockObject 原型)。
我让游戏将块保存在如下文件中
我得到我正在保存的对象实例的名称,并将其存储在一个字符串中 我开始将给定对象的信息写入具有类名称的字符串中(表示它是什么类型的块,例如,作为 BlockGrass.java 对象的块将存储为 BlockGrass)。 通常,当从保存文件读取信息时,我正在读取保存文件,当它获取块的信息时,它首先将块类型保存在本地字符串中(在这种情况下为 BlockGrass),还保存位置(x 坐标和y 坐标)。然后它将运行一系列 if 语句,如下所示
if(blockType.equals("BlockGrass"))
{
blocksArray.add(new BlockGrass(...));
}
else if(blockType.equals("BlockStone"))
{
blocksArray.add(new BlockStone(...));
}
etc
现在我想让我的游戏动态变化,并且如果有人决定制作一个新的 Block 类(修改游戏),他们不必修改 MapReader 类。因此,与其运行如上所示的一系列 if 语句(每次创建一个新的块类,都必须为该块放置一个新的 if 语句),我想要它,以便它创建一个具有的类的新对象与 BlockType 同名。为了让您更好地了解以下内容
BlocksArray.add(new blockType(...));
上面显示的内容不起作用的原因是因为 blockType 是一个字符串,其中包含我要使用的类的名称。不是类名
如果不使用 if 语句,我怎么能做这样的事情?
【问题讨论】:
-
使用 Class.forName(String).newInstance();
-
您似乎在重新发明序列化?
-
@redge 虽然这确实给了我类的实例,但我不能这样做
.add(new Class.forName(String).newInstance()); -
创建一个通用工厂,它接收一个应该扩展超类的块类型,然后您只需传递块类型引用并返回块类型的正确实例...