Абстрактный класс для создания экземпляра другого реализованного абстрактного класса - PullRequest
0 голосов
/ 23 октября 2018

Итак, я пытаюсь сделать игру с использованием 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 Ответ

0 голосов
/ 25 октября 2018

Я рекомендую избегать наследования везде, где это возможно.Это просто делает вашу жизнь проще.Вместо этого сделайте что-то вроде этого:

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 bullets ).Это отделяет вашу логическую модель от реальной физики или кода рендеринга.Обязательно добавьте больше аргументов в конструктор оружия, чтобы описать, что делает ваше оружие отличным или уникальным от других видов оружия.Эта информация затем может быть использована в методе shoot() для запуска пули с предоставленными атрибутами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...