Java 有没有一种方法可以在子类上实现一个我可以从它的子类访问属性的方法?
我正在尝试构建一个学习Java的应用程序,基本上它是一个基于控制台的足球比赛 该类玩家具有名称、编号、年龄等所有属性。。 还有从球员延伸而来的其他职业,他们是球员角色——前锋、后卫、中场、守门员。 角色实现了一个接口,该接口具有获取每个角色自己的属性公式(如防御力和攻击力)的方法。 然后有一种方法,就是一般的力量,这个公式对每个人都是平等的,独立于玩家的角色 如果我在child的类方法中设置了通用的Power,那么我必须在每个角色类中编写相同的代码,有好几次我几乎可以肯定这是错误的。。代码重用 也许我必须在接口上实现该方法,但我不知道如何继续 我有一个链接,在开发部门 下面是一些代码,试图理解我想弄明白的东西Java 有没有一种方法可以在子类上实现一个我可以从它的子类访问属性的方法?,java,inheritance,interface,polymorphism,Java,Inheritance,Interface,Polymorphism,我正在尝试构建一个学习Java的应用程序,基本上它是一个基于控制台的足球比赛 该类玩家具有名称、编号、年龄等所有属性。。 还有从球员延伸而来的其他职业,他们是球员角色——前锋、后卫、中场、守门员。 角色实现了一个接口,该接口具有获取每个角色自己的属性公式(如防御力和攻击力)的方法。 然后有一种方法,就是一般的力量,这个公式对每个人都是平等的,独立于玩家的角色 如果我在child的类方法中设置了通用的Power,那么我必须在每个角色类中编写相同的代码,有好几次我几乎可以肯定这是错误的。。代码重用
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;
}
}
下面的答案只是一个建议,并不是唯一可能的解决方案。它通过让玩家实现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
}
getPowerMultiplier方法仍然非常相似,但这种方法试图最小化重复
关于您的代码,请注意两点:
你有点疯狂地使用浮动的poinnt类型。通常,如果一个方法接受一个float,它应该为double返回一个相同的float,除非很明显转换是必要的或有意的。
使用包装器对象而不是原语有什么原因吗?特别是对于类型转换,这可能会导致糟糕的情况。
向我们展示您的代码,而不是试图描述它。@shmosel我已经在GitHub上发布了一个指向我的项目的链接,并提供了一些代码,试图更好地解释。您可能需要考虑将Player变成一个抽象类。另外,为什么要为getAttackPower和getDefensePower传入一个值?@Powerlord是指在接口中?用户将为这些插入一个值,现在您已经指出,我想我可以将这些重构为“set”。@JohnnesSouza是的,如果这些值只被设置一次,您甚至可以将它们放入构造函数中。这一点我明白了,既然你已经指出了这些要点,我想我的头脑有点兴奋,试图使用包装器而不是原语。根本没有理由。我会花一些时间来实施你的建议,看看它是如何工作的。我喜欢在方法中去掉那些神奇数字的想法!谢谢