Проблема удаления объектов в Java - PullRequest
1 голос
/ 11 мая 2011

Допустим, графика Мир , допустим, API из Мир и Актер , и я построил объект из новое имя класса Еда , которое присуще Актер , но в определенных ситуациях мне нужно, чтобы объект исчез из моего мира. какой должен быть хороший способ сделать это?

Я пробовал это:

public void killFood ()
    {
            getWorld().removeObject(this);  // >>>>>Kill any object that inherate from Food and operate this method.
    }

Но это не убило какой-либо предмет из класса, который присущи из еды ... почему?

Я завернул его (в классе Food):

public void act() 
    {
        if (canMove())
            move();
        else
            killFood();
    }



public boolean canMove()
    {
        World myWorld = getWorld();
        int x = getX();
        int y = getY();
         y--;
        // test for outside border
        if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) 
            return false;
        else if (x < 0 || y < 0)    // if out of the 1st quarter
            return false;
        return true;    // if inside 1st quarter & borders it can be move. 
    }

Но объект не исчез ... почему?

Спасибо !!

=============================================== =========================================== РЕДАКТИРОВАТЬ: метод canMove и класс грибов

public boolean canMove()
    {
        World myWorld = getWorld();
        int x = getX();
        int y = getY();

        // test for outside border
        if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) {
            return false;
        }
        else if (x < 0 || y < 0) {
            return false;
        }
        return true;
    }

public class Mushroom  extends Food
{
    private final int NEED_TOGO_LEFT = 3;
    private int mushroomGotDown=0; // counter for regular +1 down steps

    public void move()
    {
            mushroomGotDown++;
            //  if mushroom didn't got down 2 times, go down one time.
            if (mushroomGotDown != NEED_TOGO_LEFT) 
                setLocation(getX() , getY() + 1);
                else    //  mushroom got down twise, third will be 1 step left.
                {
                    setLocation(getX() - 1 , getY());
                    mushroomGotDown=0;
                }    
    } 
}   // end of class Mushroom

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Я предполагаю, что ваш код выглядит следующим образом:

public abstract class Food {
    ...
    public void killFood () {
        getWorld().removeObject(this);
    }

    public void act() {
        if (canMove()) {
            move();
        } else { 
            killFood();
        }
    }
}

public class Cheezeburger extends Food {
    ...
}

На первый взгляд, это должно работать.

Возможные причины, по которым чизбургер не удаляется, включают:

  • ваш код на самом деле не вызывает act() на чизбургере,
  • getWorld() возвращает другой мир тому, который вы ожидаете,
  • World.removeObject(...) не работает должным образом,
  • класс Cheezeburger (или суперкласс) переопределил act или canMove или killFood, а методы переопределения делают неправильную вещь.

Все эти сценарии можно суммировать как «ошибка в другом месте».


Предполагая, что вы проверили свой код и не можете найти проблему, следующим шагом должно быть выполнениеон использует отладчик и пошагово проходит по коду, который не работает, чтобы увидеть, что на самом деле происходит.

1 голос
/ 11 мая 2011

Похоже, getWorld().removeObject(this) удалит только конкретный экземпляр из вашего мира. Он не удалит все экземпляры определенного класса из вашего мира.

Вам нужно вызывать getWorld (). RemoveObject для каждого конкретного экземпляра класса, который вы хотите удалить.

Чтобы увидеть, как это работает, попробуйте что-то вроде этого:

Food foo1 = new Food();
Food foo2 = new Food();
Food foo3 = new Food();

World world = new World();
world.add(foo1, ...);  //Be sure to place each object in a distinct position so you can see each one.
world.add(foo2, ...);  
world.add(foo3, ...);

//Now delete one. 
foo1.killFood(); 

//one of th ethree should go away. 

В любом случае, я думаю из ваших вопросов, что вы путаете экземпляры класса с самим классом.

Это, конечно, при условии, что removeObject работает.

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