gpt4 book ai didi

Java - 从父类动态改变子类

转载 作者:行者123 更新时间:2023-12-02 08:15:53 25 4
gpt4 key购买 nike

我有一个类(class),其中包含以下内容:

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) {

}

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

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

最佳答案

是的,你可以做到。 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);
}
}

关于Java - 从父类动态改变子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6459926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com