我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法。
我想在抽象类的另一个方法中调用抽象类中的方法。
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
这导致递归无限循环和堆栈溢出。
[...]但是 this.delete(id, true)
呼叫删除 FileGroup
而不是在中调用删除 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
委托调用子类。
你的问题是什么并不完全清楚。如果你只是想制作这个方法 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);
}
}
如果你的问题是如何做出一个论点 delete
方法 Controller
称之为两个论点 delete
方法 Controller
而不是版本 FileGroup
,答案是你应该使用@ aioobe的帮助方法解决方案。