在受保护的 void 超级方法中返回
Returning in protected void super method
我正在为 Minecraft Spigot 插件制作拼写系统,我有很多继承层。
public class Spell {
protected void onActivate(Player p) {
}
public Spell() {
}
}
这是我的基础法术 class。然后,我有一个 class 有冷却时间的法术。
public class CooldownSpell extends Spell {
protected int cooldownTicks = 0;
protected int maxCooldownTicks = 0;
protected void onActivate(Player p) {
super.onActivate(p);
if (cooldownTicks > 0) {
return;
} else {
cooldownTicks = maxCooldownTicks;
}
}
public CooldownSpell(int cooldown) {
this.maxCooldownTicks = maxCooldownTicks;
}
// I am using a Bukkit scheduler to decrease cooldown ticks every tick
public void decreaseCooldownTicks() {
cooldownTicks--;
}
public int getMaxCooldownTicks() {
return maxCooldownTicks;
}
public void setMaxCooldownTicks(int maxCooldownTicks) {
this.maxCooldownTicks = maxCooldownTicks;
}
}
对于那些不知道的人,Minecraft 中的滴答是 1/20 秒。
在onActivate()中,有一个if语句:如果cooldownTicks大于0,我想return从此方法和所有调用super.onActivate()的方法。但是,这在 subclasses.
中不起作用
public class DamageSpell extends CooldownSpell {
private double radius;
private double damage;
public DamageSpell(int cooldown, double radius, double damage) {
super(cooldown);
this.maxCooldownTicks = cooldown;
this.radius = radius;
this.damage = damage;
}
@Override
public void onActivate(Player p) {
super.onActivate(p);
// spell code stuff here
}
使用上面的代码,这是一个继承自 CooldownSpell 的法术,我希望拥有与超级class相同的冷却系统,但 return 语句仅 return来自 superclass 方法,而不是 DamageSpell 方法。
如何在任何子classes 的onActivate 方法中,在CooldownSpell class return 的onActivate 方法中创建return 语句?
没有办法完全做到这一点(据我所知),但你可以做什么:
public class CooldownSpell extends Spell {
public final void onActivate(Player p) {
super.onActivate(p);
if (cooldownTicks > 0) {
return;
} else {
cooldownTicks = maxCooldownTicks;
}
this._onActivate(p);
}
protected void _onActivate(Player p){}
}
public class DamageSpell extends CooldownSpell {
private double radius;
private double damage;
public DamageSpell(int cooldown, double radius, double damage) {
super(cooldown);
this.maxCooldownTicks = cooldown;
this.radius = radius;
this.damage = damage;
}
@Override
protected void _onActivate(Player p) {
// spell code stuff here
}
}
然后您只需调用 onActivate(p)
,如果它没有提前 return,将调用您的 _onActivate(p)
方法。
我正在为 Minecraft Spigot 插件制作拼写系统,我有很多继承层。
public class Spell {
protected void onActivate(Player p) {
}
public Spell() {
}
}
这是我的基础法术 class。然后,我有一个 class 有冷却时间的法术。
public class CooldownSpell extends Spell {
protected int cooldownTicks = 0;
protected int maxCooldownTicks = 0;
protected void onActivate(Player p) {
super.onActivate(p);
if (cooldownTicks > 0) {
return;
} else {
cooldownTicks = maxCooldownTicks;
}
}
public CooldownSpell(int cooldown) {
this.maxCooldownTicks = maxCooldownTicks;
}
// I am using a Bukkit scheduler to decrease cooldown ticks every tick
public void decreaseCooldownTicks() {
cooldownTicks--;
}
public int getMaxCooldownTicks() {
return maxCooldownTicks;
}
public void setMaxCooldownTicks(int maxCooldownTicks) {
this.maxCooldownTicks = maxCooldownTicks;
}
}
对于那些不知道的人,Minecraft 中的滴答是 1/20 秒。
在onActivate()中,有一个if语句:如果cooldownTicks大于0,我想return从此方法和所有调用super.onActivate()的方法。但是,这在 subclasses.
中不起作用public class DamageSpell extends CooldownSpell {
private double radius;
private double damage;
public DamageSpell(int cooldown, double radius, double damage) {
super(cooldown);
this.maxCooldownTicks = cooldown;
this.radius = radius;
this.damage = damage;
}
@Override
public void onActivate(Player p) {
super.onActivate(p);
// spell code stuff here
}
使用上面的代码,这是一个继承自 CooldownSpell 的法术,我希望拥有与超级class相同的冷却系统,但 return 语句仅 return来自 superclass 方法,而不是 DamageSpell 方法。
如何在任何子classes 的onActivate 方法中,在CooldownSpell class return 的onActivate 方法中创建return 语句?
没有办法完全做到这一点(据我所知),但你可以做什么:
public class CooldownSpell extends Spell {
public final void onActivate(Player p) {
super.onActivate(p);
if (cooldownTicks > 0) {
return;
} else {
cooldownTicks = maxCooldownTicks;
}
this._onActivate(p);
}
protected void _onActivate(Player p){}
}
public class DamageSpell extends CooldownSpell {
private double radius;
private double damage;
public DamageSpell(int cooldown, double radius, double damage) {
super(cooldown);
this.maxCooldownTicks = cooldown;
this.radius = radius;
this.damage = damage;
}
@Override
protected void _onActivate(Player p) {
// spell code stuff here
}
}
然后您只需调用 onActivate(p)
,如果它没有提前 return,将调用您的 _onActivate(p)
方法。