在 Java 中创建对象时从子类属性设置类属性



我正在尝试为我的对象设置一个属性,但是该值来自数学函数,其值将从班级子的类中获得。

我尝试使用构造函数上的方法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 (一个。

最新更新