所以,我最近刚从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);
}
如果你想使用一个公共的基类,同样的基本模式也适用,不同的是,如果在所有的类中都有一个公共的实现,它可以被分解到基类中。
另一种方法是使用访问者模式。虽然一开始很难理解,但它比上面概述的方法提供了更多的灵活性和可扩展性。