为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地8271018 2021-12-01 19:30:17
所以我正在尝试使用 LibGDX 制作游戏,所以我的代码有点乱,所以我会在这里简化它。基本上我有一个抽象类武器和抽象类子弹。在武器类中,应该有一个 Bullet 类型的字段。我该怎么办?这是为了让射击方法可以创建正确子弹的实例。另外,如果我要在抽象 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 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


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 */

}

这遵循组合优于继承原则,它允许您保持代码简单并提供更多控制权:


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 项目符号)。这将您的逻辑模型与实际物理或渲染代码分开。确保向武器构造函数添加更多参数,以描述是什么使您的武器与其他武器不同或独特。然后可以在shoot()方法中使用此信息,使用提供的属性发射子弹。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信