我对 Java 和编程比较陌生,所以如果这个问题看起来很愚蠢,我深表歉意。我正在为 Java 编程类创建一个战斗游戏——我有一个带有一些基本方法的 Hero 类和一个扩展 Hero 但添加了自己独特方法的子类 Paladin。我想要一个 Battleground 对象,它可以传入 ANY Hero 类,然后检查传入的是哪个特定子类。如何确定传入的是哪个 Hero 子类?
public class Hero {
private String name;
private int hitPoints;
public Hero (String name, int hitPoints) {
this.name = name;
this.hitPoints = hitPoints;
}
public String getName() { return this.name; }
public int getHitPoints() { return this.hitPoints; }
public void takeDamage(int amount) { this.hitPoints -= amount; }
}
Run Code Online (Sandbox Code Playgroud)
这是圣骑士班
public class Paladin extends Hero {
public Hero (String name, int hitPoints) {
super(name, hitPoints);
}
public void heal(int amount) {
this.hitPoints += amount;
}
}
Run Code Online (Sandbox Code Playgroud)
所以在战场类中,我有一个方法尝试(错误地)检查传入的英雄是否是圣骑士。我该怎么做呢?if 语句是一个占位符伪代码,只是为了阐明我的意思。
public class Battleground {
private Hero player;
public Battleground (Hero player) {
this.player = player;
}
public void startRound() {
// HERE!!
if (player.equals(Paladin)) {
player.heal();
}
}
}
Run Code Online (Sandbox Code Playgroud)
考虑到您的职业实际建模的内容,对于战场来说,知道圣骑士在回合开始时会自我治疗并没有多大意义,战场也没有责任确保圣骑士自我治疗。
一个更明智的设计是让游戏通知英雄回合已经开始,并让特定的Hero子类控制该回合开始时那种英雄的行为。例如:
public class Hero {
// ...
public void onRoundStart() {
// do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
public class Paladin extends Hero {
// ...
@Override
public void onRoundStart() {
// your heal method takes an int as its argument
heal(10);
}
}
Run Code Online (Sandbox Code Playgroud)
public class Battleground {
// ...
public void startRound() {
// let the particular Hero subclass control what happens
player.onRoundStart();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这样您就不需要任何if语句或instanceof检查,而且定义 Paladin 行为的代码也位于Paladin它所属的类中。如果以后想更改圣骑士的规则,更容易知道需要编辑哪个职业。
这种重构被称为“用多态替换条件”。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |