Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类来实例化另一个实现的抽象类_Java_Instance_Abstract Class - Fatal编程技术网

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

Java 抽象类来实例化另一个实现的抽象类,java,instance,abstract-class,Java,Instance,Abstract Class,所以我尝试使用LibGDX制作一个游戏,所以我的代码有点混乱,所以我将在这里简化它。基本上我有一个抽象类武器和抽象类子弹。在武器类中,应该有一个字段用于一种子弹。我该怎么办?这样,放炮方法就可以创建正确子弹的实例 另外,如果我要在抽象Bullet类中创建一个静态列表,并将每个实例添加到其中,这会起作用吗?或者每一个不同的项目符号都会改变吗 public abstract class Weapon { public Bullet bullet; } public abstract cla

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

我建议尽可能避免继承。这只会让你的生活更轻松。相反,可以这样做:

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();

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

将子弹更改为接口而不是抽象类。顺便说一句,感谢您,现在一切正常;是的,还有很多东西可以让它与众不同,但它是为大学设计的,所以我必须对我的要求抽象一些,哈哈