You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TournamentIncome类的calculateGradeBonus()方法中访问PlayerIncome的income变量?

问题:如何在TournamentIncome类中访问PlayerIncome的income变量

需要在TournamentIncome的calculateGradeBonus()方法中使用PlayerIncome的income变量计算奖金,该如何实现?

背景代码结构

项目文件结构

  • Player.java(抽象基类)
  • Tax.java(接口)
  • PlayerIncome.java(继承Player并实现Tax,包含income实例变量)
  • GradeBonus.java(接口)
  • TournamentIncome.java(继承Player并实现GradeBonus)
  • PlayerTest.java

核心代码片段

PlayerIncome类

public class PlayerIncome extends Player implements Tax {

double income;
double tax;

public PlayerIncome(String name, double income) {
    super(name);
    this.income = income;
}

@Override
public void calculateTax() {
    tax = income * (TAX_PERCENT / 100);
}

@Override
void displayDetails() {
    System.out.println("Player Name: " + name);
    System.out.println("Income: " + income);
    System.out.println("Tax: " + tax);
}
}

TournamentIncome类

public class TournamentIncome extends Player implements GradeBonus {

String grade;
int rate;

public TournamentIncome(String name, String grade, int rate) {
    super(name);
    this.grade = grade;
    this.rate = rate;
}

@Override
public void calculateGradeBonus() {
    // 需要访问PlayerIncome的income变量
}

@Override
void displayDetails() {
     
}
}

Player抽象类

public abstract class Player {
String name;

public Player(String name) {
    this.name = name;
}

abstract void displayDetails();
}

解决方案

方案1:通过组合注入PlayerIncome实例

TournamentIncome与PlayerIncome是平级子类,无法直接访问对方的实例变量。可以在TournamentIncome中持有PlayerIncome的引用,通过构造方法或setter注入后访问income。

修改后的TournamentIncome类:

public class TournamentIncome extends Player implements GradeBonus {

String grade;
int rate;
private PlayerIncome playerIncome;
private double gradeBonus; // 存储计算后的奖金

// 修改构造方法注入PlayerIncome
public TournamentIncome(String name, String grade, int rate, PlayerIncome playerIncome) {
    super(name);
    this.grade = grade;
    this.rate = rate;
    this.playerIncome = playerIncome;
}

@Override
public void calculateGradeBonus() {
    if (playerIncome != null) {
        // 基于PlayerIncome的income计算奖金
        gradeBonus = playerIncome.income * rate / 100;
    }
}

@Override
void displayDetails() {
    System.out.println("Player Name: " + name);
    System.out.println("Grade: " + grade);
    if (playerIncome != null) {
        System.out.println("Base Income: " + playerIncome.income);
        System.out.println("Grade Bonus: " + gradeBonus);
        System.out.println("Total Income: " + (playerIncome.income + gradeBonus));
    }
}
}

方案2:将income提升到父类Player中

如果income是所有Player子类的通用属性,直接将其移到抽象基类Player中,子类可直接访问。

修改Player类:

public abstract class Player {
String name;
protected double income; // protected修饰,子类直接访问

public Player(String name, double income) {
    this.name = name;
    this.income = income;
}

abstract void displayDetails();
}

修改PlayerIncome构造方法:

public PlayerIncome(String name, double income) {
    super(name, income); // 调用父类带income的构造方法
}

修改TournamentIncome类:

public class TournamentIncome extends Player implements GradeBonus {

String grade;
int rate;
private double gradeBonus;

public TournamentIncome(String name, String grade, int rate, double income) {
    super(name, income);
    this.grade = grade;
    this.rate = rate;
}

@Override
public void calculateGradeBonus() {
    // 直接使用父类的income计算奖金
    gradeBonus = income * rate / 100;
}

@Override
void displayDetails() {
    System.out.println("Player Name: " + name);
    System.out.println("Grade: " + grade);
    System.out.println("Base Income: " + income);
    System.out.println("Grade Bonus: " + gradeBonus);
    System.out.println("Total Income: " + (income + gradeBonus));
}
}

方案3:给PlayerIncome添加getter方法

若不想调整继承结构,给PlayerIncome添加公共getter方法,TournamentIncome持有PlayerIncome实例后通过方法获取income。

修改PlayerIncome类:

public class PlayerIncome extends Player implements Tax {

double income;
double tax;

// ... 原有代码 ...

// 添加income的getter方法
public double getIncome() {
    return income;
}
}

修改TournamentIncome类:

public class TournamentIncome extends Player implements GradeBonus {

String grade;
int rate;
private PlayerIncome playerIncome;
private double gradeBonus;

public TournamentIncome(String name, String grade, int rate, PlayerIncome playerIncome) {
    super(name);
    this.grade = grade;
    this.rate = rate;
    this.playerIncome = playerIncome;
}

@Override
public void calculateGradeBonus() {
    if (playerIncome != null) {
        double baseIncome = playerIncome.getIncome();
        gradeBonus = baseIncome * rate / 100;
    }
}

@Override
void displayDetails() {
    System.out.println("Player Name: " + name);
    System.out.println("Grade: " + grade);
    if (playerIncome != null) {
        System.out.println("Base Income: " + playerIncome.getIncome());
        System.out.println("Grade Bonus: " + gradeBonus);
        System.out.println("Total Income: " + (playerIncome.getIncome() + gradeBonus));
    }
}
}

内容的提问来源于stack exchange,提问作者Pratik Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:45:16