2013-01-18 58 views
0

假設三個類,一個是另一個的子類。每一個都會覆蓋父母的方法。覆蓋方法:如何「注入」超級方法?

public class BaseClass { 

    public void doStuff() { 
     performBaseTasks(); 
    } 

} 

public class MiddleClass extends BaseClass { 

    // {BaseClass} Overrides 

    public void doStuff() { 
     performMiddleTasks(); 
     super.doStuff(); 
    } 

} 

public class FinalClass extends MiddleClass { 

    // {BaseClass} Overrides 

    public void doStuff() { 
     performFinalTasks(); 
     super.doStuff(); 
    } 

} 

當調用new FinalClass().doStuff(),這將導致一個方法 invokation順序如下:

  1. performFinalTasks();
  2. performMiddleTasks();
  3. performBaseTasks();

我希望把perfomFinalTasks()之間performMiddleTasks()performBaseTasks()。我怎樣才能做到這一點?

  1. performMiddleTasks();
  2. performFinalTasks();
  3. performBaseTasks();
+1

這是一個詭計問題或來自實際用例的東西嗎?您可以訪問哪些課程,例如,您可以更改哪些課程? – Scorpion

+0

@Scorpion:不,這不是一個詭計的問題。它來自一個實際的使用案例,其中中產階級正在建立一些數據,最終的課程需要與之合作。但是,基類方法的執行仍然必須最終執行。我可以改變任何這些類。 –

+0

那麼,如果它是一個實際的用例,那麼最終的類應該如我的回答中所建議的那樣支持它,以及javadoc提到它的作用和它迎合的特殊用例。 – Scorpion

回答

1

一種可能的方式,如果你可以讓中產階級摘要:

public abstract class MiddleClass extends BaseClass { 

    // {BaseClass} Overrides 
    public void doStuff() { 
     performMiddleTasks(); 
     doProxyExec(); 
     super.doStuff(); 
    } 

    public abstract void doProxyExec(); 
} 

你重寫你的子類的代理方法:方法調用鏈的

public class FinalClass extends MiddleClass { 

    // {BaseClass} Overrides 
    public void doStuff() { 
     super.doStuff(); 
    } 

    // {MiddleClass} Overrides 
    public void doProxyExec(
     performFinalTasks(); 
    } 
} 

一個不是很多態的方式,但是,原來的設計又是那麼奇怪。

2

寫最終類doStuffDifferently一個公共方法()和調用的順序這些方法。我不確定可以通過doStuff()方法中的其他技巧來實現。