Как избежать проверки типов - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над проектом, в котором есть какой-то GameObject.Это может быть что угодно, шар, монета, растение.И я должен передать список GameObject другому классу, который отображает объекты на экране.

Объекты GameObject могут быть подвижными и неподвижными.Некоторые GameObjects могут пропускать объекты через них (Pervious), а некоторые нет.Некоторые GameObjetcs имеют троны (которые могут взорвать мяч), а некоторые нет.Некоторые GameObjects - это монеты, которые собираются, когда мяч попадает в них.

Итак, я сделал это -

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 Ответ

1 голос
/ 26 сентября 2019

Я предлагаю вам использовать 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
}

Это называется паттерном стратегии.Надеюсь, это то, что вы ищете, у объектов есть действия, и они называются, что бы они ни делали, когда они действуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...