抽象类实例化另一个实现的抽象类

时间:2018-10-23 00:58:59

标签: java instance abstract-class

因此,我尝试使用LibGDX制作游戏,因此我的代码有点混乱,因此在此我将其简化。基本上,我有一个抽象类武器,和一个抽象类子弹。在武器类别中,应该有一个子弹类型字段。我该怎么办?这样射击方法就可以创建正确子弹的实例。

如果我要在抽象的Bullet类中创建一个静态列表并将每个实例添加到它,这行得通吗?还是会针对每个实施的项目符号而改变?

public abstract class Weapon {
    public Bullet bullet;
}

public abstract class Bullet { 
    public Vector2 position;
    public Bullet(Vector2 position){
        this.position = position;
    }
}

public Rifle extends Weapon{
    this.bullet = RifleBullet.class;
}

public RifleBullet extends Bullet{
    public RifleBullet(Vector2 start){ 
        super(start);   
    }    
}

1 个答案:

答案 0 :(得分:1)

我建议尽可能避免继承。它只会使您的生活更轻松。相反,请执行以下操作:

public class Weapon {
   private final Bullet template;

   public Weapon(Bullet template) {
      this.template = template;
   }
   /* shoot logic here */
}

public class Bullet { 
   private final Vector2 position;
   private final float velocity;
   public Bullet(float speed) {
      this.position = new Vector2();
      this.speed = speed;
   }
   /* setters and getters */
}

这遵循Composition over Inheritance原则,该原则使您可以保持代码简单并给予更多控制:

Bullet rifleBullet = new Bullet(2f);
Weapon rifle = new Weapon(rifleBullet);

Bullet shotgunBullet = new Bullet(5f);
Weapon shotgun = new Weapon(shotgunBullet);

/* somewhere in update() */
shotgun.shoot();
rifle.shoot();

然后,shoot()方法可以实现实际子弹的创建(例如,使用libgdx bullets)。这会将您的逻辑模型与实际物理或渲染代码分开。确保向武器构造器添加更多参数,以描述使您的武器与其他武器不同或独特的原因。然后,可以在shoot()方法中使用提供的属性来发射此信息。