【发布时间】:2014-06-20 04:53:10
【问题描述】:
所以在我的一个简单游戏引擎中,我使用了一个接口“UpdatedGameElement”来表示必须通过一个 update() 方法的实现,每帧更新具有该接口的对象。
现在在我的“主”(不是主)类中,我遍历 GameElement 的列表并检查这些是否是更新游戏元素的实例。如果是这种情况,我会强制转换它们,然后调用 .update()。
现在问题是,我刚刚读到使用 instanceof 通常是编码错误的标志;如果类被用作标记,而它们可以很容易地被变量替换,我同意。但我不太确定自己的情况。
我想我可以让 GameElement 类实现 UpdatedGameElement,并定义一个标准的空 update() 方法,该方法需要被覆盖才能真正做某事,但我不确定这是否以及为什么会比我拥有的更好现在。
你会说什么?
编辑:我的主类中的一些代码:
public void process()
{
if (active)
{
for (GameElement GE: elements)
{
if (!GE.isToBeRemoved())
{
//Relevant part
if (GE instanceof UpdatedGameElement)
{
((UpdatedGameElement) GE).update();
}
}
else
{
prepareRemoval(GE);
}
}
processRemovals();
}
}
【问题讨论】:
-
为什么不更新所有的 GameElements?还是将它们存储在自己的列表中?
-
我们需要看代码。
instanceof不一定是坏事,但这种情况表明你最好持有一个单独的数据结构,它只包含可更新的对象。 -
您确定有必要将所有 GameElement 保存在同一个列表中吗?你在哪里创建/添加元素到列表
elements? -
为什么不是每个
GameElement都有一个update()?如果在某些情况下它是无操作的,那么它比instanceof测试更糟糕。我认为这是一个见仁见智的问题。关键问题是这个,它有效吗? -
@DavidEhrmann:GameElement 类不可更新。到目前为止,一个类必须将 UpdatedGameElement 实现为“可更新”(如具有 void update() )。是的,你是对的:我可以让 GameElement 自己实现它,但我很好奇你是否可以同时使用这两种方法。 (至于为什么:我目前的课程会使类更干净,因为它们不需要子类可能使用一千种方法。)还发布了一些代码:)
标签: java oop instanceof