在受保护的 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) 方法。