2012-03-17 1 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() не будет перекрываться.

myMethod() будет вызывать super.myMethod() [он не был переопределен так на самом деле супер будет вызван immidiately], и супер будет вызывать [если будут выполнены условия] 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

Приятно ответить, что идея возможного решения может заключаться в создании другого метода, который будет вызывать только от родителя. любите его повышать, но не можете принять в качестве ответа. хотите знать, почему? см. обновленный вопрос. –

+2

@ShailendraRajawat: Я прочитал редактирование, метод API остается 'myMethod()', overriden 'myTemplateMethod()' будет вызываться только из 'myMethod()' супер. API не изменяется вообще из-за использования шаблона шаблона метода, единственное, что делает изменения, это то, что подклассы переопределяют 'myTemplateMethod()' вместо 'myMethod()'. Invokation остается с помощью 'myMethod()'. – amit

+0

Agree.seems моя мечта предоставить то же имя myMethod() не может сбыться. Спасибо за ваши усилия. идя с этим решением. –

Смежные вопросы