Java - 从Parentclass动态更改子类

时间:2011-06-23 20:03:14

标签: java compare subclass

我有一个课程,其中包含以下内容:

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 个答案:

答案 0 :(得分:2)

是的,你可以做到。 obj.getClass()将返回obj的确切类,无论你声明哪种类型的obj。 我建议你不要在有可能的地方使用反射。您可以使用枚举替换属性继承:

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

答案 1 :(得分:0)

您基本上寻找的是Class.isAssignableFrom(...)。它将检查当前类是否相同,或者是给定类的as参数的超类。

您只需遍历数组并删除重复的属性并将新属性添加到其中。