对多个对象类型使用链表呈现/处理循环



所以,我最近刚从c++切换到java用于android编程,这可能是一个简单的修复,但我还没能弄清楚:((是的,我试着搜索,虽然不是100%确定正确的术语,所以可能错过了它)

差不多,我有一个

public static LinkedList<Object> LList = new LinkedList<Object>();

用于渲染和动画对象的定义。问题是因为我只有一个链表,而我需要为每个对象类型使用if(LList.get(I) instanceof ship)的多个对象类型。

例如

int i;   
    if(LList.size()>=1)
    {
        for(i=0;i<LList.size();i++)
        {
            if(LList.get(i) instanceof ship)
                ((ship) LList.get(i)).animate(elapsedTime);
            else if(LList.get(i) instanceof Laser)
                ((Laser) LList.get(i)).animate(elapsedTime);
        } 
    }
可以说我疯了,但这似乎不是最好的方法。它的工作原理……但是在c++中,你所要做的只是让ship和laser拥有相同的父类,然后你就可以调用。animate而不用担心(ship/laser)类型转换。

在java中有办法做到这一点吗?我尝试了同样的方式,你会在c++中,但这似乎没有工作。请记住,我是java新手,所以可能只是做错了。

我虽然认为我可以修改LList。添加函数,这样你也可以在添加时预先定义对象类型,这将摆脱instanceof问题,但并没有真正增加任何灵活性。

无论如何,谢谢你的时间!

有几种方法可以做到这一点。最简单的方法是定义基类或接口来定义列表中所有对象的公共功能。例如,您可能有:

public interface Animatable {
    public void animate(long elapsedTime);
}
public class Ship implements Animatable {
    public void animate(long elapsedTime) {
        // implementation for Ship
    }
}
// etc for other classes

那么你可以写:

public static LinkedList<Animatable> LList = new LinkedList<Animatable>();
// ...
for (Animatable object : LList) {
    object.animate(elapsedTime);
}

如果你想使用一个公共的基类,同样的基本模式也适用,不同的是,如果在所有的类中都有一个公共的实现,它可以被分解到基类中。

另一种方法是使用访问者模式。虽然一开始很难理解,但它比上面概述的方法提供了更多的灵活性和可扩展性。

相关内容

  • 没有找到相关文章

最新更新