首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -动态更改Parentclass中的子类

Java -动态更改Parentclass中的子类
EN

Stack Overflow用户
提问于 2011-06-24 04:03:14
回答 2查看 171关注 0票数 0

我有一个类,它包含以下内容:

代码语言:javascript
复制
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)); 
                }
            }
        }
    }

我的想法是以某种方式使用如下方法:

代码语言:javascript
复制
public void setAttribute(Class attribute.getClass(), int value) {

    }

在此方法中,调用者将指定要更改的属性类型(如强度、智能等),并且进程将遍历上面列出的充满属性的向量数组,通过识别传递的属性子类是否等于所述向量的子类来确定要操作哪个属性。如果是这种情况,向量中的子类将会改变。

这个是可能的吗?我问这个的主要原因是我不确定obj.getClass()/getType() == obj2.getClass()/getType()是否也会考虑子类。

EN

回答 2

Stack Overflow用户

发布于 2011-06-24 04:17:23

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

代码语言:javascript
复制
enum Attribute {
    STREGTH, AGILITY, SPEED, ...;
}

并拥有以下内容:

代码语言:javascript
复制
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);
     }
}
票数 2
EN

Stack Overflow用户

发布于 2011-06-24 04:21:34

你基本上要找的是Class.isAssignableFrom(...)。它将检查当前类是否与给定的as参数类的超类相同。

您只需迭代数组,删除重复的属性并向其添加新属性即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6459926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档