我正在尝试为我的对象设置一个属性,但是该值来自一个数学函数,该函数的值将从类的子类中获取。
我尝试在构造函数上使用init方法,但是没有
主要类别:
public abstract class Player {
private double attackPower;
private double defensePower;
private double generalPower;
// Getters and Setters
// The method to set the generalPower
private void setGeneralPower(){
this.generalPower = defensePower + attackPower * 100;
}
其中一个子类:
public class Goalkeeper extends Player {
private static final double DEFENSE_COEFFICIENT = 3.0;
private static final double ATTACK_COEFFICIENT = 0.5;
@Override
public void setAttackPower(double attackPower) {
super.setAttackPower(attackPower * ATTACK_COEFFICIENT);
}
@Override
public void setDefensePower(double defensePower) {
super.setDefensePower(defensePower * DEFENSE_COEFFICIENT);
}
}
当我在getGeneralPower()
上插入数学函数时
该函数返回正确的值,但我需要该值以
具有将来进行比较的属性。
如果我在构造函数上插入方法,则会得到0.0值。
如果我在构造函数上使用init方法,并从init主体中调用setGeneralPower()
,那么它也会给我0.0的结果。
拥有setGeneralPower()
的原因是为了设置generalPower
属性的值。
答案 0 :(得分:0)
您的代码甚至都不应使用setGeneralPower()
方法。
相反,给该类一个getter方法public double getGeneralPower()
,该方法将计算并返回适当的值。将其设置为 calculated 属性,该属性可在需要时调用适当的可覆盖方法。
例如
public abstract class Player {
private double attackPower;
private double defensePower;
// **** get rid of this and make it a calculated property
// private double generalPower;
public double getGeneralPower() {
return 100 * getAttackPower() + getDefensePower();
}
否则,如果您忘记调用设置器(实际上是非设置器方法),则该方法将给出错误的答案。这样,可以保证返回值是最新且正确的。
关于您的更新:
拥有
setGeneralPower()
的原因是为了设置generalPower
属性的值。
再次 不要 为该类提供generalPower字段,问题得以解决。
再次记住,如果防御力或攻击力发生变化,则一般权限可能会发生变化,因此您必须保护代码以防发生这种情况。如果使用此类的编码器(其他人或您将来的自己)忘记在getter之前立即调用该setter,那么他们将陷入严重麻烦。
请注意,即使没有一般权力字段,它仍然是该类的属性或属性,一个,但是是有效的(也是 safe )。