如何避免类型检查

时间:2019-09-26 12:32:00

标签: java oop generics design-patterns

我正在研究一个带有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
}

我知道这是错误的代码。如何将其重构为不使用类型检查?

我能想到的一种方法是使用列表。但这不是现在真正的方法,如果我现在想游泳的话该怎么办?然后,我确实必须在一个新列表中存储游泳物体。

谢谢

1 个答案:

答案 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
}

这称为策略模式。希望这就是您要寻找的,对象具有动作,并且无论它们在执行动作时会如何调用它们。