为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2023-02-16 14:16:00
我正在尝试为我的对象设置一个属性,但该值来自一个数学函数,它的值将从类子类中获取。我试过在构造函数上使用方法 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。
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您的代码甚至不应该有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字段,它仍然是类的一个属性或特性,一个计算的,但是一个有效的(和安全的)。


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号