gpt4 book ai didi

java - 有没有办法在子类上实现一个方法,我可以从它的子类访问属性?

转载 作者:行者123 更新时间:2023-12-02 09:45:16 25 4
gpt4 key购买 nike

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

类(class)球员拥有所有属性,如姓名、号码、年龄..还有其他类别从玩家延伸而来,它们是玩家角色(前锋、后卫、中场、守门员)。角色实现了一个接口(interface),该接口(interface)具有获取每个角色自己的属性公式(例如防御力和攻击力)的方法。那么就有一个方法,就是通用力量,这个公式对每个人来说都是平等的,与玩家的角色无关。

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

也许我必须在接口(interface)上实现该方法,但我不知道如何继续。

我有一个关于 GitHub 的链接- 它位于开发分支上。

下面是一些代码,可以尝试理解我想要弄清楚的内容。

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;
}
}

最佳答案

以下答案只是一个建议,到目前为止并不是唯一可能的解决方案。它通过让 Player 使用抽象类实现PlayerAttribute接口(interface):

 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 也是如此),除非明显有必要或有意进行转换。
  • 您使用包装对象而不是基元有什么原因吗?特别是对于类型转换,这可能会导致丑陋的情况。

关于java - 有没有办法在子类上实现一个方法,我可以从它的子类访问属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com