通过多态性交换对象的位置

时间:2013-12-28 16:35:01

标签: java polymorphism swap

我正在尝试解决Blockworld问题的一个实例。基本上,NxN网格包含块A,B,C和代理。只有代理可以移动,如果遇到阻止,那么他们的位置将被切换。例如,代理(1,0)左边遇到块B(0,0),那么两个的新位置将是代理(0,0)和B(1,0)。

我的Agent和Block类都是Entity的子类。

这是我的函数swap()。它检查移动后,代理是否在一个块上,然后新的块位置将是代理的先前位置。

我尝试使用(块块:blockList)并且当我尝试使用多态时它可以工作,但不能使用(实体en:entityList)。

有人能发现我犯的错误吗?

public void swap() {

    for (Entity en : entityList) {
        if (agent.position.equals(block.position) && (en instanceof Block))  {
            System.out.print("Agent overlap block: " + en);
            en.previousPosition = new Dimension(block.position.width, block.position.height);
            en.setPosition(agent.previousPosition); 
        }
    }
}

3 个答案:

答案 0 :(得分:1)

首先,你还没有告诉if语句中的“块”来自何处。 您可能需要做的是:

public void swap(){
    for(Entity en:entityList){
        if((en instanceof Block)&&(en.position.equals(agent.position)){
                    //                 ^here is "en" instead of block
            System.out.println("Agent overlab block: "+en);
            en.previousPosition=new Dimension(
                    en.position.width,
                    en.position.height);
            en.setPosition(agent.previousPosition);
        }
    }
}

最后,您可以使用java.awt.Point而不是Dimension。 此外,您应该对字段“previousPosition”使用setter方法。

答案 1 :(得分:0)

您的问题是,如果agent.positionblock.position相等,您的代码会执行操作;但在您谈到的示例中,agent.positionblock.position是不同的。因此,您的代码实际上从未进行任何更改。

答案 2 :(得分:0)

您在函数中使用block变量的任何地方都需要使用en进行更改,因为您的for循环不再创建名为block的变量。

当您在此功能中移动实体时,请注意不要意外尝试将代理与自身交换!