我正在研究一个带有GameObject的项目。它可以是任何东西,例如球,硬币或植物。而且我必须将GameObject的列表传递给其他一些类,这些类将对象呈现在屏幕上。
GameObjects可以移动,也不能移动。一些GameObjects可以允许通过它们传递对象(Pervious),而另一些则不允许。有些GameObjetcs有宝座(可能会爆炸),有些则没有。一些游戏对象是硬币,当球撞击它们时会收集它们。
所以我做到了-
Class GameObject{
// All things common to both entities.
// Feilds - hasThrones, canPassthrough, isCoin
...
...
}
Class MovingGameObject extends GameObject implements Moveable{
moveable logic;
...
...
}
Class FlyingGameObject extends GameObject implements Flyable{
Flyable logic;
...
...
}
现在我有一个列表
问题 当我移动可移动对象时,我正在做类似的事情:
if gameobject is an instance of MovingGameObject{
// do something
}
if gameobject is an instance of FlyingGameObject{
// do something
}
我知道这是错误的代码。如何将其重构为不使用类型检查?
我能想到的一种方法是使用列表。但这不是现在真正的方法,如果我现在想游泳的话该怎么办?然后,我确实必须在一个新列表中存储游泳物体。
谢谢
答案 0 :(得分:1)
我建议您将GameObject用作抽象类并定义常见行为
abstract class GameObject{
// fields etc. ..
// maybe some implementation
// the "do something method"
public abstract void doSomething();
}
扩展它时,可以在doSomethingMethod中传递您的实现
class MovingGameObjectOne extends GameObject implements Moveable {
moveable logic;
@Override
moveableMethod1() { }
@Override
moveableMethod2() { }
@Override
moveableMethod3() { }
@Override
doSomething() {
moveableMethod1();
moveableMethod2();
moveableMethod3();
// you don't have to check for instance as it is implementation
}
}
与其他特殊飞行和可移动物体相同
然后在您的过程中,实现是隐藏的
GameObject instance1 = new MoveableObjectOne();
GameObject instance2 = new FlyingObjectTwo();
instance1.doSomething(); // <- the block of your if is in implementation
instance2.doSomething(); // <- the block of your if is in implementation
anotherMethodForExample(instance1);
anotherMethodForExample(instance2);
private void anotherMethodForExample(GameObject parameterIsAnInterface) {
parameterIsAnInterface.doSomething(); // <- the block of your if is in implementation
}
这称为策略模式。希望这就是您要寻找的,对象具有动作,并且无论它们在执行动作时会如何调用它们。