2012-03-17 3 views
0
Class parent { 

protected void myMethod() { 
if(someCodition) { 
//return this as well as child's myMethod. 
    } 
} 

Class child extends Parent { 

@override 
protected void myMethod() { 
super.myMethod(); 
//code below this line should not execute if someCondition. 
//want parent to handle all this 
    } 
} 

부모 클래스에 부울 플래그 종류를 사용하고 하위 클래스에서 확인하십시오. 실제로 자식 클래스는 다른 개발자가 사용하게 될 것이고 그러한 조건에주의를 기울여서 부모 자체에서 벗어나고 싶지는 않을 것입니다.부모 메서드에서 자식 메서드를 반환하는 방법?

나는 그것이 oops의 추상 원리에 위배된다는 것을 충분히 알고 있지만 위반할 필요가있다.

PS 업데이트

: MyMethod라는()가 어린이나 부모가 제어하거나 아닌 호출하므로 대답 한 바와 같이 별도의 메소드를 만들 수 없다. 실제로는 API 메소드가 필요에 따라 시스템에서 자동으로 실행하므로 호출을 중단 할 수 없습니다.

+0

간결한 구체적인 예 및 구문 상 올바른 코드는 만족스러운 대답을 얻는 데 도움이됩니다. –

답변

2

당신은 아마 template method pattern를 찾고 있습니다 [또는 일부 변화가]

사용자가 보호 방법 myTemplateMethod()을 무시하며, myMethod()가 오버라이드 (override)되지 않습니다.

myMethod()super.myMethod()는 [그렇게 실제로 슈퍼 immidiately 호출됩니다 오버라이드 (override)되지] 및 [조건이 충족되는 경우] 슈퍼가 호출합니다 호출합니다 [의사 코드]의 라인을 따라 myTemplateMethod()

뭔가 :

abstract Class parent { 

protected abstract void myTemplateMethod(); 

protected final void myMethod() { 
if(someCodition) { 
    myTemplateMethod(); 
    } 
} 

Class child extends Parent { 

@override 
protected void myTemplateMethod() { 
//code that will be invoked only if someCodition is met 
    } 
} 
+0

좋은 답변입니다. 가능한 해결책은 부모로부터 만 호출 할 수있는 다른 방법을 만드는 것일 수 있습니다. upvote 사랑하지만 대답으로 받아 들일 수 없습니다. 이유를 알고 싶습니까 ?? 업데이트 된 질문을 참조하십시오. –

+2

@ShailendraRajawat : 편집을 읽었을 때, API 메소드는'myMethod()'로 유지되고, 오버라이드 된 myTemplateMethod()는 슈퍼의 myMethod()에서만 호출됩니다. 템플릿 메소드 패턴 사용으로 인해 API가 전혀 변경되지 않지만 변경된 것은 서브 클래스가'myMethod()'대신'myTemplateMethod()'를 오버라이드한다는 것이다. Invokation은'myMethod() '를 사용하여 남아 있습니다. – amit

+0

동의 함 myMethod()가 같은 이름을 제공하는 내 꿈을 실현할 수 없습니다. 당신의 노력에 감사드립니다. 이 솔루션을 사용하십시오. –

관련 문제