在 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 方法并setGeneralPower()从 init 主体调用,它也会给我一个 0.0 结果。


之所以有一个setGeneralPower()是为了设置属性的值generalPower。


慕尼黑5688855
浏览 153回答 1
1回答

蝴蝶刀刀

您的代码甚至不应该有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(实际上是非 setter 方法),该方法会给出错误的答案。这样,可以保证返回值是最新的和正确的。关于您的更新:之所以有一个setGeneralPower()是为了设置属性的值generalPower。再次 不要给班级一个 generalPower 领域,问题就解决了。再次记住,如果防御力或攻击力发生变化,一般力量有可能发生变化,因此您必须保护您的代码免受这种情况的影响。如果使用这个类的编码员——其他人或你未来的自己——忘记在调用 getter 之前调用 setter,他们就会有大麻烦。请注意,即使没有generalPower字段,它仍然是类的一个属性或特性,一个计算的,但是一个有效的(和安全的)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java