2015-01-11 15 views
11

我有一个抽象类和一个扩展它的类,我在这两个类中都有一个同名的方法。 我想在抽象类的另一个方法中调用抽象类中的方法。从抽象类中调用另一种方法在实际类中具有相同名称

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)呼叫deleteFileGroup而不是调用Controllerdelete这是造成递归无限循环和堆栈溢出。

+0

@aioobe这并不完全清楚。为什么OP不写'super.delete(id,central)'?这可能是OP实际上希望'FileGroup'中的'delete'来调用Controller中的一个参数'delete'方法,然后在Controller中调用两个参数'delete'而不会造成无限循环。 –

+0

*“为什么OP没有写super.delete(id,central)?”* - 因为这是无意义的覆盖。 *“[...]没有造成无限循环。”* - 是的,这就是我所想的(这就是我在我的回答中所说的)。 – aioobe

+1

由于//做某事,这不会是毫无意义的重写。 –

回答

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委托调用子类。

+0

谢谢你的回答我同意你的意见,但是有没有像'this'这样的提及当前类的东西,如果它是静态的,我可以直接调用Controller :: delete(id,true) –

+1

Nope。你必须做这种解决方法。 – aioobe

3

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

+0

谢谢你的回答它会解决我的问题,但我真的想知道是否有什么像'这个'提到当前类,如果它是静态我可以只是打电话给控制器::删除(id,true) –

+1

@MohseTaheri没有方法来调用'this'类中的实例方法,并阻止代替执行子类中的版本。无论如何,该功能毫无意义。由于您是通过定义来控制当前类,您总是可以使用aioobe的解决方案 - 而不是从该类中调用私有(或最终)方法。 –

相关问题