2015-01-11 7 views
11

나는 그것을 확장하는 추상 클래스와 하나의 클래스를 가지고 있는데, 두 클래스 모두에서 같은 이름의 메서드를 가지고있다. abstract 클래스의 다른 메서드에서 abstract 클래스의 메서드를 호출하려고합니다.실제 클래스에서 같은 이름을 가진 추상 클래스의 다른 메서드에서 메서드 호출

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.deleteController.delete하지만 this.delete(id, true) 대신 재귀 무한 루프를 유발하고 스택 오버 플로우된다 Controllerdelete 전화의 통화에 FileGroupdelete.

+0

@aioobe 전적으로 명확하지 않습니다. 왜 OP는'super.delete (id, central)'를 쓰지 않았을까? 그것은 OP가 실제로'FileGroup'에서'delete'를 원할 경우 Controller에서 한 개의 인자'delete' 메쏘드를 호출 할 것입니다. 그리고 무한 루프를 일으키지 않고'Controller'에서 두 개의 인자'delete'를 호출합니다. –

+0

* "왜 OP가 super.delete (id, central)를 쓰지 않았습니까?"* - 이는 무의미한 무시가되기 때문입니다. * "[...] 무한 루프를 일으키지 않습니다."* - 예, 그렇게 생각합니다. – aioobe

+1

'/ do something' 때문에 무의미한 오버라이드는 아닐 것입니다. –

답변

7

[...]하지만 this.delete(id, true) 전화 대신 Controller에서 삭제 호출하는 FileGroup에 삭제합니다.

예, 모든 메소드는 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

귀하의 질문이 무엇인지 완전히 명확하지 않습니다. 당신은 그냥 스택 오버 플로우를 발생시키지 않고 ControllerFileGroup 호출 방법 delete(id, true)의 방법 delete을 만들려고 노력하는 경우, 당신은이 작업을 수행 할 수 있습니다

public class FileGroup extends Controller { 

    public Result delete(Long id, boolean central) { 
     // do something 
     return super.delete(id, true); 
    } 
} 

를 귀하의 질문에 하나의 인수 delete 방법을 만드는 방법 경우 Controller에서 메서드를 FileGroup이 아닌 Controller이라는 메서드에서 호출하면 대답은 @ aioobe의 도우미 메서드 솔루션을 사용해야한다는 것입니다.

+0

답변을 주셔서 감사합니다 내 문제를 해결할 것입니다하지만 난 진짜 알고 싶어요 '현재의 클래스를 언급하는'이 같은 경우 정적, 그냥 호출 할 수 있습니다 컨트롤러 :: 삭제 (ID, true) –

+1

@ MohseTaheri 'this' 클래스에서 인스턴스 메소드를 호출하고 하위 클래스의 버전이 대신 실행되는 것을 막을 수 있습니다. 어쨌든이 기능은 무의미합니다. 정의에 따라 현재 클래스를 제어 할 수 있으므로 항상 aioobe의 솔루션을 사용할 수 있습니다. 대신이 클래스에서 비공개 (또는 최종) 메서드를 호출하십시오. –