从抽象 class 的另一个方法调用方法,实际 class 具有相同的名称
Call method from another method in abstract class with same name in real class
我有一个抽象 class 和一个扩展它的 class,我在两个 class 中都有一个同名的方法。
我想在抽象 class.
的另一个方法中调用抽象 class 中的方法
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)
在 FileGroup
中调用 delete
而不是在 Controller
中调用 delete
这是导致递归无限循环和堆栈溢出。
[...] but this.delete(id, true)
call delete in FileGroup
instead of calling delete in 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
将调用委托给子类。
不太清楚你的问题是什么。如果你只是想让 FileGroup
中的方法 delete
调用 Controller
中的方法 delete(id, true)
而不会导致堆栈溢出,你可以这样做:
public class FileGroup extends Controller {
public Result delete(Long id, boolean central) {
// do something
return super.delete(id, true);
}
}
如果您的问题是如何使 Controller
中的单参数 delete
方法调用 Controller
中的双参数 delete
方法,而不是调用 Controller
中的版本FileGroup
,答案是你应该使用@aioobe的辅助方法解决方案。
我有一个抽象 class 和一个扩展它的 class,我在两个 class 中都有一个同名的方法。 我想在抽象 class.
的另一个方法中调用抽象 class 中的方法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)
在 FileGroup
中调用 delete
而不是在 Controller
中调用 delete
这是导致递归无限循环和堆栈溢出。
[...] but
this.delete(id, true)
call delete inFileGroup
instead of calling delete inController
.
是的,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
将调用委托给子类。
不太清楚你的问题是什么。如果你只是想让 FileGroup
中的方法 delete
调用 Controller
中的方法 delete(id, true)
而不会导致堆栈溢出,你可以这样做:
public class FileGroup extends Controller {
public Result delete(Long id, boolean central) {
// do something
return super.delete(id, true);
}
}
如果您的问题是如何使 Controller
中的单参数 delete
方法调用 Controller
中的双参数 delete
方法,而不是调用 Controller
中的版本FileGroup
,答案是你应该使用@aioobe的辅助方法解决方案。