在Java中删除对象的问题

时间:2011-05-10 21:53:48

标签: java inheritance object

让我们说一个图形世界,让我们说一个 World API Actor ,我建了一个对象来自 Actor 固有的新类名 Food ,但在某些情况下,我需要将对象从我的世界中消失。 什么应该是一个好方法呢?

我试过了:

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

但它并没有杀死来自Food固有的Class的任何物体......为什么?

我用(

)包装它(在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方法&amp;蘑菇类

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 个答案:

答案 0 :(得分:2)

我认为您的代码如下所示:

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

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

public class Cheezeburger extends Food {
    ...
}

从表面上看,这应该有用。

为什么不去除cheezeburger的可能原因包括:

  • 您的代码实际上并未在cheezeburger上调用act()
  • getWorld()会返回与您期望的世界不同的世界,
  • World.removeObject(...)无法正常工作,
  • Cheezeburger类(或超类)已覆盖actcanMovekillFood,覆盖方法做错了。

所有这些场景都可以概括为“错误在其他地方”。


假设您已经检查过代码而无法找到问题,那么下一步应该是使用调试器运行它,然后单步执行代码,看看实际上发生了什么。

答案 1 :(得分:1)

看起来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有效。