在超类ArrayList中调用具有统一名称的子类方法

时间:2015-11-27 04:07:46

标签: java arraylist subclass

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

我有:

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();  
}

我的具体项目将有各种各样的子类型,所以我试图避免为每个可能的子类型检查“实例”。

我知道我可以输入Projectile作为接口,但这是我的计划B,因为Projectile类带有相当多的信息。

是否有更好的做事方式,或者我最好选择上述两种解决方案之一?

4 个答案:

答案 0 :(得分:1)

Projectile类应该声明一个带有受保护或公共访问的非静态抽象方法move(),并且像Bomb或Bullet这样的类的每个子节点都必须实现此方法。

编辑:将移动方法声明为抽象,除非您不想在父类中进行默认实现。否则继续使用方法覆盖,以便子类覆盖父类行为。

答案 1 :(得分:1)

在您的projectile类中,编写move方法,使其仅包含与所有子类相关的功能。然后在需要添加/更改它的每个子类中,覆盖move方法并添加所需的其他代码以区分它。这应该允许你为每个射弹调用相同的移动()但确保它为正确的射弹做正确的事。

答案 2 :(得分:1)

根据您的要求,您可以使用runtime time polymorphism

在您的代码中,您可以public void move()方法使用Projectile中的一些默认业务逻辑,类BombBullet扩展Projectile类意味着它们是子这里的Projectile类可以覆盖每个类中的move()方法,在运行时,您可以拥有一个List<Projectile> projectiles的List,它可以包含Projectile类的sub对象的对象您的案例ProjectileBomb中的Bullet类。

因此,当您遍历projectiles并调用move()方法时,java运行时决定哪个Object(BombBulletmove()必须调用哪个实习生删除使用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();
        }
    }
}

答案 3 :(得分:0)

如何使用类似List的通用通配符 此列表可以包含您的类Bomb和Bullets

更多细节 Java Wildcard generic