gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:40:34 25 4
gpt4 key购买 nike

所以我正在尝试使用 LibGDX 制作一个游戏,所以我的代码有点困惑,所以我将在这里简化它。基本上我有一个抽象类 Weapon 和一个抽象类 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);
}
}

最佳答案

我确实建议尽可能避免继承。它只会让您的生活更轻松。相反,做这样的事情:

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() 方法中使用此信息并使用提供的属性发射子弹。

关于java - 抽象类实例化另一个已实现的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com