从实际类中具有相同名称的抽象类中的另一个方法调用方法

时间:2015-01-11 14:09:28

标签: java class abstract-class superclass

我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法。 我想在另一个抽象类方法中调用抽象类中的方法。

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.deletethis.delete(id, true)拨打delete中的FileGroup,而不是在delete中调用导致递归的Controller无限循环和堆栈溢出。

2 个答案:

答案 0 :(得分:7)

  

[...]但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委托对子类的调用。

答案 1 :(得分:3)

你的问题是什么并不完全清楚。如果您只是想在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中的版本1}},答案是你应该使用@ aioobe的辅助方法解决方案。