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

所以我正在尝试使用 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);   

    }    

}


慕的地8271018
浏览 130回答 1
1回答

牧羊人nacy

我确实建议尽可能避免继承。它只会让您的生活更轻松。相反,请执行以下操作: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()方法中使用此信息,使用提供的属性发射子弹。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java