我正在寻找一个解决当前问题的简单方法。
我有:
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类带有相当多的信息。
是否有更好的做事方式,或者我最好选择上述两种解决方案之一?
答案 0 :(得分:1)
Projectile类应该声明一个带有受保护或公共访问的非静态抽象方法move(),并且像Bomb或Bullet这样的类的每个子节点都必须实现此方法。
编辑:将移动方法声明为抽象,除非您不想在父类中进行默认实现。否则继续使用方法覆盖,以便子类覆盖父类行为。
答案 1 :(得分:1)
在您的projectile类中,编写move方法,使其仅包含与所有子类相关的功能。然后在需要添加/更改它的每个子类中,覆盖move方法并添加所需的其他代码以区分它。这应该允许你为每个射弹调用相同的移动()但确保它为正确的射弹做正确的事。
答案 2 :(得分:1)
根据您的要求,您可以使用runtime time polymorphism
在您的代码中,您可以public void move()
方法使用Projectile
中的一些默认业务逻辑,类Bomb
和Bullet
扩展Projectile
类意味着它们是子这里的Projectile
类可以覆盖每个类中的move()
方法,在运行时,您可以拥有一个List<Projectile> projectiles
的List,它可以包含Projectile
类的sub对象的对象您的案例Projectile
和Bomb
中的Bullet
类。
因此,当您遍历projectiles并调用move()
方法时,java运行时决定哪个Object(Bomb
或Bullet
)move()
必须调用哪个实习生删除使用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