Вызов метода из другого метода в абстрактном классе с тем же именем в реальном классе
У меня есть абстрактный класс и один класс, которые его расширяют, у меня есть метод с тем же именем в обоих классах.
Я хочу вызвать метод в абстрактном классе в другом методе абстрактного класса.
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.