Java - динамически изменить подкласс от родительского класса - PullRequest
0 голосов
/ 24 июня 2011

У меня есть класс, который имеет следующее:

final class Attributes {

    Attribute agility;
    Attribute endurance;
    Attribute intelligence;
    Attribute intuition;
    Attribute luck;
    Attribute speed;
    Attribute strength;

    private ArrayList<Attribute> attributes;

    private boolean initialized = false;

    public Attributes() throws IllegalAccessException {
        initializeAttributes();
        store();
    }

    public ArrayList<Attribute> getAttributes() {
        return attributes;
    }

    private void initializeAttributes() {
        if (!initialized) {

            agility = new Agility();
            endurance = new Endurance();
            intelligence = new Intelligence();
            intuition = new Intuition();
            luck = new Luck();
            speed = new Speed();
            strength = new Strength();

            initialized = true;
        }
    }

    private void store() throws IllegalAccessException {
        Field[] fields = this.getClass().getDeclaredFields();

        attributes = new ArrayList<Attribute>();

        if (initialized) {

            for (Field f : fields) {
                if (f.getType() == Attribute.class) {
                    attributes.add((Attribute)f.get(this)); 
                }
            }
        }
    }

Моя идея так или иначе использовать такой метод:

public void setAttribute(Class attribute.getClass(), int value) {

    }

В этом методе вызывающая сторона будет указывать тип атрибута для изменения (например, сила, интеллект и т. Д.), И процесс будет проходить через векторный массив, полный атрибутов, перечисленных выше, чтобы определить, каким атрибутом манипулировать, путем определение того, был ли переданный подкласс атрибута равен подклассу из упомянутого вектора. Если бы это было так, подкласс в векторе был бы изменен.

Возможно ли это? Основная причина, по которой я спрашиваю об этом, потому что я не уверен, что obj.getClass () / getType () == obj2.getClass () / getType () также примет во внимание подклассы.

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Да, вы можете сделать это. obj.getClass () будет возвращать точный класс obj, независимо от того, какой тип obj вы объявляете. Я советую вам не использовать отражение там, где это возможно. Вы можете заменить наследование атрибута на enum:

enum Attribute {
    STREGTH, AGILITY, SPEED, ...;
}

И есть что-то вроде:

public final class Attributes {
     private Map<Attribute, Integer> attributes = new EnumMap(Attribute.class);

     private void initializeAttributes() {
        if (!initialized) {
            for(Attribute att : Attribute.values()) {
                attributes.put(att, 0);
            }
            initialized = true;
        }
     }


     public void setAttribute(Attribute attribute, int value) {
         attributes.put(attribute, value);
     }
}
0 голосов
/ 24 июня 2011

То, что вы в основном ищете, это Class.isAssignableFrom (...) .Он проверит, является ли текущий класс тем же или суперклассом класса, заданного параметром.

Вам нужно просто перебрать массив, удалить дублирующийся атрибут и добавить в него новый атрибут.

...