2012-04-05 73 views
2

我有一個叫Base類,它有一個名爲​​方法。大約有100個類從這個基類派生,並提供他們自己的​​的實現。現在,我有一些我想要在Base.SomeMethod()中輸入的常用邏輯。該方法需要在​​的末尾調用。我的問題是否可以在不更改每個派生類的​​方法的情況下調用此方法?如何調用基類方法不改變所有派生類

回答

7
public class Base { 
    public final void execute() { 
     doExecute(); 
     someMethod(); 
    } 

    protected abstract void doExecute(); 

    public void someMethod() { 
    } 
} 

此解決方案可防止super code smell

+0

我必須將所有派生類從執行更改爲doExecute正確嗎? – Asha 2012-04-05 18:38:01

+0

@Asha是的,但大多數IDEs會讓所有的方法一次改變,所以它不應該是一個大問題。 – Jeffrey 2012-04-05 18:39:53

2

是的,但你必須改變呼叫者。調用者必須調用doExecute()(儘管找到一個更好的名字)方法,您在基類中將其定義爲final,並調用​​,然後調用通用代碼。

另一種選擇是面向方面的編程,但我不會推薦它用於此目的,也就是要「破解」代碼。

的問題是:爲什麼在100個左右的類別這樣的問題改變方法的名字嗎?這是使用IDE單擊鼠標。

+0

是的,這很簡單..但我不是每個從我的班級派生出來的人都記得調用這個方法。 – Asha 2012-04-05 18:30:59

+0

如果你已經在使用Spring或者類似於允許半非痛苦代理的東西,這並不是一個很糟糕的想法。但我同意;爲了方便起見,我不會走這條路。咬住項目符號,並儘可能更改所有派生類。 – 2012-04-05 18:32:11

+0

他們不需要,因爲它是相反的。看看@Jeffrey發佈的代碼,這就是我的意思。 – biziclop 2012-04-05 18:34:29

0

不是我所知道的。下一次你應該考慮你可能想爲所有擴展類添加一些常見的操作,並且要求super.execute()

0

只能通過使用代表您的代碼的東西;這對純Java來說是不可能的。

0

讓我說出你的問題,我的理解:動物類有有執行和因繼承所有子類有這個會員呼吸()方法,除非有呼吸的人非常不同的方式將覆蓋。

現在,在呼氣的方法結束時,你要調用CloseEyes()動物類的方法,並且可以是部分或全部子類覆蓋CloseEyes()方法,這是事實。

所以你的問題:每當你想他們CloseEyes但是從動物類,而不是從派生類的任何動物的氣息。

  1. 如果已經有CloseEyes()在許多派生類中的方法,那麼你實際上是做一些錯誤調用基類的CloseEyes()。

  2. 如果你仍然只想調用基類的方法,那麼爲什麼你需要相同的方法名稱 - 你只是說AnimalEyeClose(),使其成爲私人的,並在動物類中。

+0

我什麼時候說我想用同名的方法? – Asha 2012-04-06 05:18:55

相關問題