Java 在超类ArrayList中使用统一名称调用子类方法

Java 在超类ArrayList中使用统一名称调用子类方法,java,arraylist,subclass,Java,Arraylist,Subclass,我正在寻找一个更简单的解决当前问题的方法 我有: public class Projectile{ .... } public class Bomb extends Projectile{ .... public void move(){ //travels in arc } } public class Bullet extends Projectile{ .... public void

我正在寻找一个更简单的解决当前问题的方法

我有:

public class Projectile{ 
    .... 
}

public class Bomb extends Projectile{        
    ....    
    public void move(){
        //travels in arc
    }
}

public class Bullet extends Projectile{
    ....    
    public void move(){
        //travels straight
    }
}
现在,假设我有一个大的抛射物阵列列表,其中既有炸弹也有子弹。我正在寻找一种在炸弹和子弹中调用移动方法的方法

for(Projectile projectile: projectiles){
    //functional equivalent of projectile.move();  
}
我的特定项目将有大量不同的子类型,因此我试图避免为每个可能的子类型检查“实例”

我知道我可以输入sparlode作为接口,但这是我的计划B,因为sparlode类包含大量信息


有没有更好的方法,或者我最好选择上述两种解决方案之一?

Sproject类应该声明一个具有受保护或公共访问权限的非静态抽象方法move(),此类的每个子类(如Bomb或Bullet)都必须实现此方法


编辑:将move方法声明为抽象方法,除非您不希望在父类中使用默认实现。否则,继续进行方法重写,以便子类重写父类行为。

使用类似列表的通用通配符怎么样 此列表可以包含炸弹和子弹这两个类

更多细节

在投射类中,编写move方法,使其仅包含属于所有子类的功能。然后,在需要添加/更改它的每个子类中,重写move方法并添加区分它所需的任何附加代码。这应该允许您为每个投射物调用相同的move(),但确保它对正确的投射物执行正确的操作。

根据您的要求,您可以使用

在你的代码中,你可以有
public void move()
方法,在
抛射体中有一些默认的业务逻辑,类
Bomb
Bullet
扩展
抛射体
类意味着它们是
抛射体
的子类,在这里你可以覆盖每个类中的
move()
方法,在运行时,您可以有一个
列表射弹
列表,其中可以包含
射弹
子类的
射弹
对象的对象

因此,当您迭代射弹并调用
move()
方法时,java运行时将决定哪个对象(
Bomb
Bullet
move()
必须调用哪个intern删除
instanceof
关键字用法

根据您的示例,您可以执行以下操作

public class Projectile {
   ....
    public void move() {
        //default implementation
    }

    }

    public class Bomb extends Projectile {

    ....    
        public void move() {
        //travels in arc
    }
}

public class Bullet extends Projectile {

    ....    
        public void move() {
        //travels straight
    }
}

public class TestMain {

    public static void main() {
        List<Projectile> projectiles = new ArrayList<>();
        projectiles.add(new Bomb());
        projectiles.add(new Bullet());

        for (Projectile projectile : projectiles) {
            projectile.move();
        }
    }
}
公共类{
....
公开作废动议(){
//默认实现
}
}
公营炸弹{
....    
公开作废动议(){
//以弧线行进
}
}
公共级子弹弹{
....    
公开作废动议(){
//直走
}
}
公共类TestMain{
公共静态void main(){
列表投射物=新的ArrayList();
添加(新炸弹());
添加(新项目符号());
用于(射弹:射弹){
投射物。移动();
}
}
}

将射弹类定义为抽象类。并在类中定义抽象的move()方法。这是我最初尝试的,但它总是调用该方法的默认版本。哦,嗯,我没有考虑这种可能性。拉文德拉预见到了这一点。我想关键是在超类中将方法定义为抽象的。很高兴了解未来;)。