2012-03-17 41 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

一個簡化的具體示例 - 以及語法正確的代碼 - 會提高您得到滿意答案的機率。 – 2012-03-17 13:14:25

回答

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

不錯的答案。給我想法,可能的解決方案可能是創建一個不同的方法,只會從父母調用。愛上了它,但不能接受作爲答案。想知道爲什麼?請參閱更新的問題。 – 2012-03-17 11:31:32

+2

@ShailendraRajawat:我讀了編輯,API方法仍然是'myMethod()',只有從超級myMethod()調用覆蓋'myTemplateMethod()'。由於模板方法模式的用法,API根本不會改變,唯一會改變的是子類將會覆蓋'myTemplateMethod()'而不是'myMethod()'。 Invokation仍然是使用'myMethod()'。 – amit 2012-03-17 11:40:28

+0

Agree.seems我的夢想提供相同的名稱myMethod()不能實現。謝謝你的努力。用這個解決方案。 – 2012-03-17 15:20:39