如何在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
相关产品推荐
相关产品推荐

