Возврат в методе protected void super - PullRequest
0 голосов
/ 05 августа 2020

Я делаю систему заклинаний для плагина Minecraft Spigot, и у меня много уровней наследования.

public class Spell {
    protected void onActivate(Player p) {

    }

    public Spell() {

    }
}

Это мой базовый класс Spell. Затем у меня есть класс для заклинаний с перезарядкой.

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, я хочу вернуться из этого метода и всех методов, вызывающих super.onActivate (). Однако это не работает в подклассах.

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, я хочу иметь ту же систему восстановления, что и суперкласс, но только оператор return возвращается из метода суперкласса, а не из метода DamageSpell.

Как мне сделать так, чтобы оператор return в методе onActivate класса CooldownSpell возвращался из метода onActivate в любых подклассах?

1 Ответ

1 голос
/ 05 августа 2020

Нет способа сделать это точно (насколько я знаю), но что вы могли бы сделать:

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), который, если он не возвращается раньше , вызовет ваш метод _onActivate(p).

...