如何将父类私有int类型字段的初始构造值翻倍?Java继承重写方法问题
解决方案
核心逻辑是在Vampire子类中单独新增字段存储构造初始化的原始生命值,避免使用父类中动态变化的当前剩余生命值计算翻倍数值,无需修改原有Enemy父类代码。
步骤1:修改Vampire类定义,新增存储初始生命值的字段
在Vampire类中新增私有字段保存构造时的初始血量,构造阶段完成赋值:
public class Vampire extends Enemy { // 存储构造函数初始化的原始生命值,如果需要后续复活时基数同步翻倍可去掉final修饰 private final int originalHitPoints; // 请根据你实际的Vampire构造参数调整,只要保证父类构造执行完成后赋值即可 public Vampire(String name, int initHitPoints, int initLives) { super(name, initHitPoints, initLives); // 构造时将原始初始值存入新增字段 this.originalHitPoints = initHitPoints; // 如果你的构造函数没有直接传入initHitPoints,也可以用父类的get方法获取初始值: // this.originalHitPoints = getHitPoints(); } // 重写后的takeDamage方法 @Override public void takeDamage(int damage) { int inflictedDamage = damage/2; int remainingHitPoints = getHitPoints() - inflictedDamage; int remainingLives = getLives() - 1; if (remainingHitPoints > 0) { setHitPoints(remainingHitPoints); System.out.println(getName() + " took " + inflictedDamage + " damage(Vampire takes inflicted damage) and has " + remainingHitPoints + " HitPoint left" + "\n------------------------------------" ); } else { setLives(remainingLives); System.out.println(getName() + " took " + inflictedDamage + " damage(Vampire takes inflicted damage)" + "\n------------------------------------" + "\n" + getName() +" lost a life" + "\n------------------------------------"); if (remainingLives > 0) { System.out.println(getName() + " revived and even got stronger!" + "\n------------------------------------"); // 直接基于原始初始值计算翻倍后的血量 setHitPoints(originalHitPoints * 2); // 如果需求是每次复活后下次复活的基数也同步翻倍,在这里加一行更新字段即可: // this.originalHitPoints = originalHitPoints * 2; } else { System.out.println(getName() + " is dead now RIP" + "\n------------------------------------"); setHitPoints(0); } } } }
方案说明
父类Enemy的hitPoints字段设计用来存储动态变化的当前剩余血量,本来就不具备存储初始最大值的作用,所以在子类新增独立字段存储初始值是符合面向对象封装原则的最优方案,完全不会影响父类和其他子类的逻辑。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

