有没有一种方法可以在子类上实现可以从子类访问属性的方法?

时间:2019-06-21 21:08:21

标签: java inheritance interface polymorphism

我正在尝试构建一个学习Java的应用,基本上这是在控制台上进行的足球比赛。

Class Player具有所有属性,例如姓名,号码,年龄。 还有其他一些从Player扩展的类,它们是Player Roles(前锋,后卫,中场,守门员)。 角色实现了一个接口,该接口具有获取每个属性的方法(如防御力和攻击力)。 因此,这里有一种方法就是“通用权力”,这个公式等于每个人,独立于玩家的角色。

如果在子类的类方法中设置通用权限,则必须在每个角色类中编写相同的代码几次(我几乎可以肯定这是错误的。代码重用)。

也许我必须在接口上实现该方法,但是我不知道如何进行。

我在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 个答案:

答案 0 :(得分:1)

以下答案仅是一个建议,并不是迄今为止唯一的解决方案。它通过让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相同),除非明确地表明有必要或有必要进行转换。
  • 您为什么要使用包装对象而不是基元?特别是在类型转换中,这可能会导致难看的情况。