2017-01-06 3 views
1
package com.evansgame.newproject.fps; 
import java.util.concurrent.locks.ReentrantLock; 
import java.util.*; 
abstract class Weapon{ 
    int weaponID;//why can't this be static? 
    DrawMe drawMe;//why can't this be static? 
    int itemID; 
    float x; 
    float y; 
    float z; 
    static ReentrantLock weaponsLock = new ReentrantLock(); 
    static LinkedList<Weapon> weapons = new LinkedList<>(); 
    boolean active = true; 
    Weapon(int itemID, float x, float y, float z){ 
    this.itemID = itemID; 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    } 
    static class Bazoooka extends Weapon{ 
    static final int WEAPON_ID = 0; 
    static final DrawMe bazoookaDrawMe = DrawMe.colorClone(DrawMe.loadModel("bazoooka"),0,.1f,.8f,1,0,.2f); 
    Bazoooka(int itemID, float x, float y, float z){ 
     super(itemID,x,y,z); 
     drawMe = bazoookaDrawMe;//same across all Bazoookas 
     weaponID = 0;//same across all Bazoookas 
    } 
    } 
} 

Переменные weaponID и drawMe должны быть одинаковыми во всех экземплярах Bazoooka. Когда я получаю доступ к экземплярам оружия, мне нужно оружиеID и DrawMe для любого типа оружия, которым это может случиться. Похоже, что эти переменные статичны, почему мне приходится использовать переменные экземпляра для них?Почему это не может быть статичным?

+4

Если вы сделаете его статическим, тогда его значение будет одинаковым для всех ** Оружия ** не только для всех экземпляров Bazooka, так что это не очень хорошая идея. –

+2

Мне интересно, хотите ли вы использовать перечисление для некоторых ваших констант. –

+0

Но все подклассы должны иметь те же статические поля, которые являются статическими для подклассов. Есть ли способ, которым я могу поместить это определение в абстрактный суперкласс? – user28775

ответ

0

Один из вариантов: дать абстрактному классу a объявление abstract public int getId();. Пусть каждый подтип переопределяет это, возвращая свой собственный результат статического поля. Но статическое поле должно быть объявлено в подклассе не абстрактным родителем.

public abstract class Weapon { 
    public abstract int getId(); 
    public abstract DrawMe getDrawMe();  

    // .... other fields 
} 

public class Bazooka extends Weapon { 

    private static final int BAZOOKA_ID = 200; 
    private DrawMe drawMe; 

    @Override 
    public int getId() { 
     return BAZOOKA_ID; 
    } 

    @Override 
    public DrawMe getDrawMe() { 
     if (drawMe == null) { 
      drawMe = new BazookaDrawMe(); 
     } 
     return drawMe; 
    } 

} 
1

Вы можете использовать методы получения, а не просто полей:

abstract class Weapon { 
    abstract int getID(); 
    abstract DrawMe getDrawMe(); 
    ... 
} 

Тогда в классе Bazooka вы просто переопределить эти методы, как:

static final int WEAPON_ID = 0; 
static final DrawMe bazoookaDrawMe = DrawMe.colorClone(DrawMe.loadModel("bazoooka"),0,.1f,.8f,1,0,.2f); 

@Override 
int getID() { 
    return WEAPON_ID; 
} 

@Override 
DrawMe getDrawMe() { 
    return bazoookaDrawMe; 
} 
0

I закончил с использованием перечисления

package com.evansgame.newproject.fps; 
import java.util.concurrent.locks.ReentrantLock; 
import java.util.*; 
class Weapon{ 
    static enum WeaponEnum{ 
    NO_WEAPON(0, new DrawMe(),Player.loadAnimation("standing"),Player.loadAnimation("run")) 
    ,BAZOOOKA(1, DrawMe.colorClone(DrawMe.loadModel("bazoooka"),0,.1f,.8f,1,0,.2f),Player.loadAnimation("standWithBazoooka"),Player.loadAnimation("runWithBazoooka")); 
    final int WEAPON_ID; 
    final DrawMe DRAW_ME; 
    final Moment[] STANDING_ANIMATION; 
    final Moment[] RUNNING_ANIMATION; 
    WeaponEnum(int id, DrawMe d, Moment[] standingAnimation, Moment[] runningAnimation){ 
     WEAPON_ID = id; 
     DRAW_ME = d; 
     STANDING_ANIMATION = standingAnimation; 
     RUNNING_ANIMATION = runningAnimation; 
    } 
    } 
    static ReentrantLock weaponsLock = new ReentrantLock(); 
    static LinkedList<Weapon> weapons = new LinkedList<>(); 
    WeaponEnum weaponType; 
    int itemID; 
    float x; 
    float y; 
    float z; 
    boolean active = true; 
    Weapon(WeaponEnum weaponType, int itemID, float x, float y, float z){ 
    this.weaponType = weaponType; 
    this.itemID = itemID; 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    } 
}