Java 如何避免类型检查

Java 如何避免类型检查,java,oop,generics,design-patterns,Java,Oop,Generics,Design Patterns,我正在做一个有一些游戏对象的项目。它可以是任何东西——球、硬币、植物。我必须将游戏对象列表传递给其他类,这些类在屏幕上呈现对象 游戏对象可以是可移动的,也可以是不可移动的。有些游戏对象可以让对象通过透明的,有些则不允许。有些游戏机有可能使球爆炸的王座,有些则没有。一些游戏物品是当球击中它们时收集的硬币 所以我做了这个- Class GameObject{ // All things common to both entities. // Feilds - hasThrones, canPas

我正在做一个有一些游戏对象的项目。它可以是任何东西——球、硬币、植物。我必须将游戏对象列表传递给其他类,这些类在屏幕上呈现对象

游戏对象可以是可移动的,也可以是不可移动的。有些游戏对象可以让对象通过透明的,有些则不允许。有些游戏机有可能使球爆炸的王座,有些则没有。一些游戏物品是当球击中它们时收集的硬币

所以我做了这个-

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
}
我知道这是坏代码。我如何重构它而不使用类型检查

我能想到的一种方法是使用列表。但这不是现在的方式,如果我现在想要一个游泳的物体呢?然后,我必须为游泳对象存储一个新列表


谢谢

我建议您将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
}

这叫做战略模式。希望这就是您要寻找的,对象有动作,它们被调用,无论它们在动作时做什么。

使用。您不必关心对象的类型。请包含拼写正确、大写字母正确的有效代码段。如果您希望其他人努力帮助您,演示您在问题上的努力会有所帮助。此外,什么是“做某事”?这是所有游戏对象都能做到的吗?或者一些只有MovingGameObject可以做的事情?如果你使用一个接口并调用move,为什么你必须检查实现?例如,游戏对象类中的抽象方法,您在不检查实现的情况下调用它,然后将实现传递给子类。在顶层,只要调用move方法,不管它是飞还是走。@T.J.Crowder只有MovingGameObject可以做。。。。没有移动dosomething方法的游戏对象是空的?一些游戏对象不能移动?不是所有的对象都移动。这就是为什么我将普通的GameObject类扩展到MovingGameObject,并添加了一个Moveable for策略。是的,其他对象做其他事情,但只有移动或飞行实现被调用用于移动对象。如果您考虑其他非移动对象,将调用该方法,但它们会执行不同的操作。最后一件事,添加空方法是否被视为不好的做法?另外,空接口只是为了提供某种类型,怎么样?