Есть ли способ реализовать метод в дочернем классе, чтобы я мог получить доступ к атрибутам из его дочернего класса? - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь создать приложение для изучения Java, в основном это футбольный матч на консоли.

Класс игрока имеет все атрибуты, такие как имя, номер, возраст .. Существуют и другие классы, которые относятся к игроку, это роли игрока (нападающий, защитник, полузащитник, вратарь). Роли реализуют Интерфейс, который имеет методы, чтобы получить каждый из них свою собственную формулу атрибута (Как Сила Защиты и Сила атаки). Итак, есть метод, который является Общей Силой, формула которого равна всем, независимо от роли игрока.

Если я установлю General Power в методах дочернего класса, мне придется писать в каждом Role Class один и тот же код несколько раз (я почти уверен, что это неправильно .. повторное использование кода).

Может быть, я должен реализовать метод на интерфейсе, но я не знаю, как поступить.

У меня есть ссылка на GitHub - он находится на ветке Develop.

А вот ниже приведен код, который пытается понять, что я пытаюсь выяснить.

public interface PlayerAttributes {

    PlayerPosition getPlayerPosition(PlayerPosition position);

    Double getAttackPower(Float value);
}

class Player {

    String name;
    Integer number;
    PlayerPosition position; //Enum
}

public class Defender extends Player implements PlayerAttributes {

    @Override
    public PlayerPosition getPlayerPosition(PlayerPosition position) {
        return PlayerPosition.DEFENDER;
    }

    @Override
    public Double getAttackPower(Float value) {
        return value * 1.2;
    }

    @Override
    public Double getDefensePower(Float value) {
        return value * 2.5;
    }
}

1 Ответ

1 голос
/ 22 июня 2019

Следующий ответ является лишь предложением и далеко не единственным возможным решением.Он использует абстрактные классы, позволяя Player реализовать интерфейс PlayerAttribute:

 public interface PlayerAttributes {

  PlayerPosition getPlayerPosition(PlayerPosition position);

  Float getAttackPower(Float value);
  Float getDefensePower(Float value);
}

abstract class Player implements PlayerAttributes {

  String name;
  Integer number;

  @Override
  public PlayerPosition getPlayerPosition(PlayerPosition position) {
    return PlayerPosition.DEFENDER;
  }

  @Override
  public Float getAttackPower(Float value) {
    return value * attackPowerMultiplier();
  }

  public Float getDefensePower(Float value) {
    return value * defensePowerMultiplier();
  }

  public abstract Float attackPowerMultiplier();
  public abstract Float defensePowerMultiplier();
}

class Defender extends Player implements PlayerAttributes {
  public static final Float ATTACK_POWER_MUTLIPLIER = 1.2f;
  public static final Float DEFENSE_POWER_MUTLIPLIER = 2.5f;

  @Override public Float attackPowerMultiplier() {
    return ATTACK_POWER_MUTLIPLIER;
  }

  @Override public Float defensePowerMultiplier() {
    return DEFENSE_POWER_MUTLIPLIER;
  }
}

enum PlayerPosition {
  DEFENDER
}

Методы get<Type>PowerMultiplier() будут по-прежнему очень похожи, но этот подход пытается минимизировать повторения.


Два замечания по вашему коду:

  • Вы немного зациклились на типах с плавающей точкой.В общем, если метод принимает float, он должен возвращать float (то же самое для double), если не очевидно, что преобразование необходимо или предназначено.
  • Существует ли причина, по которойВы используете объекты-обертки вместо примитивов?Особенно с преобразованием типов, это может привести к ужасным ситуациям.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...