我正在尝试为我的对象设置一个属性,但是该值来自数学函数,其值将从班级子的类中获得。
我尝试使用构造函数上的方法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
属性的值。
您的代码甚至不应该具有setGeneralPower()
方法。
相反,请给出类Getter方法,即计算并返回适当值的public double getGeneralPower()
。使其成为计算的属性,该属性称为适当的方法(如果需要(。
,例如,
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();
}
否则,如果您忘记调用setter(实际上是非设定方法(,则该方法给出了错误的答案。这样,保证返回值是最新和正确的。
关于您的更新:
拥有
setGeneralPower()
的原因是设置generalPower
属性的值。
再次不要给予类A generalpoper字段,并解决了问题。
再次记住,如果防御能力或攻击能力更改,则一般力量有可能改变,因此您必须保护代码免受这种情况。如果使用此课程的编码员 - 其他人或您的未来自我 - 忘记在Getter之前就打电话给Setter,他们会陷入困境。
请注意,即使没有 a generalpoper field 它仍然是类属性或属性属性一个,但有效(和 safe (一个。