Вызов метода из другого метода в абстрактном классе с тем же именем в реальном классе

У меня есть абстрактный класс и один класс, которые его расширяют, у меня есть метод с тем же именем в обоих классах. Я хочу вызвать метод в абстрактном классе в другом методе абстрактного класса.

Controller.java

public abstract class Controller {

    public Result delete(Long id) {
        return this.delete(id, true);
    }
    public Result delete(Long id, boolean useTransaction) {
        // do something and return result
    }
}

FileGroup.java

public class FileGroup extends Controller {

    public Result delete(Long id, boolean central) {
        // do something
        return super.delete(id);
    }
}

super.delete вызовите Controller.delete, но this.delete(id, true) вызовите delete в FileGroup вместо вызова delete в Controller, который вызывает рекурсивный бесконечный цикл и переполнение стека.

Ответ 1

[...], но this.delete(id, true) вызов delete в FileGroup вместо вызова delete в Controller.

Да, все методы виртуальны в Java, и нет способа избежать этого. Однако вы можете обойти это, создав (не переопределенный) вспомогательный метод в Controller следующим образом:

public abstract class Controller {

    private Result deleteHelper(Long id, boolean useTransaction) {
        // do something and return result
    }

    public Result delete(Long id) {
        return deleteHelper(id, true);
    }
    public Result delete(Long id, boolean useTransaction) {
        return deleteHelper(id, useTransaction);
    }
}

Посредством этого вы избежите Controller.delete делегировать вызов подклассу.

Ответ 2

Это не совсем понятно, каков ваш вопрос. Если вы просто пытаетесь сделать метод delete в FileGroup вызывать метод delete(id, true) в Controller, не вызывая, вы можете просто сделать это:

public class FileGroup extends Controller {

    public Result delete(Long id, boolean central) {
        // do something
        return super.delete(id, true);
    }
}

Если ваш вопрос заключается в том, как сделать метод one-argument delete в Controller вызывать метод с двумя аргументами delete в Controller, а не версию в FileGroup, ответ заключается в том, что вы должны используйте решение @aioobe helper method.