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

时间:2019-06-23 01:23:33

标签: java inheritance polymorphism

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

我尝试在构造函数上使用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属性的值。

1 个答案:

答案 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 )。