Установка атрибута класса из дочерних атрибутов класса при создании объекта в Java - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь установить атрибут для моего объекта, но значение исходит из математической функции, которую его значения будут получать из дочерних классов класса.

Я пытался использовать метод 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 Ответ

0 голосов
/ 23 июня 2019

В вашем коде даже не должно быть метода setGeneralPower().

Вместо этого предоставьте классу метод получения, 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();
    }

В противном случае, если вы забудете вызвать установщик (не-сеттер, действительно), метод дает неверный ответ.Таким образом, возвращаемое значение гарантированно будет обновленным и правильным.

Относительно вашего обновления:

Причиной наличия setGeneralPower() являетсяустановите значение атрибута generalPower.

Снова НЕ присвойте классу поле generalPower ипроблема решена.

Опять же, помните, что общая мощность может измениться в случае изменения силы защиты или атаки, поэтому вы должны защитить свой код от этого.Если кодировщик, который использует этот класс - кто-то другой или ваше будущее само - забывает вызвать этого установщика прямо перед получателем, у них большие проблемы.

Обратите внимание, что даже без ageneralPower поле остается атрибутом или свойство класса, вычисляемым, но действительным (и безопасным ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...