2012-03-17 14 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はを(コールする)は、子供や親のコントロールのいずれかではないので、1つの答えで述べたように、別の方法を作成することはできません。 実際には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()'のままです。オーバーライドされた 'myTemplateMethod()'はスーパーの 'myMethod()'からのみ呼び出されます。テンプレートメソッドのパターンの使用により、APIはまったく変更されません。変更するのは、サブクラスが 'myMethod()'の代わりに 'myTemplateMethod()'をオーバーライドすることだけです。 Invokationは 'myMethod()'を使用しています。 – amit

+0

同名のmyMethod()を提供するという私の夢は実現できません。お疲れ様でした。この解決策をとる。 –