2010-01-26 54 views
2

除了在子類上明確添加一個方法來調用super方法外,還有什麼可以暫時「取消隱藏」嗎?我想在Test2實例上調用super.blah()方法。我必須使用像originalBlah這樣的方法,還是有另一種方法?Java隱藏:客戶端類調用`super`的任何方式?

public class TestingHiding { 
    public static void main(String[] args) { 
     Test1 b = new Test2(); 
     b.blah(); 
    } 
} 

class Test2 extends Test1 { 
    public void blah() { 
     System.out.println("test2 says blah"); 
    } 

    public void originalBlah() { 
     super.blah(); 
    } 
} 

class Test1 { 
    public void blah() { 
     System.out.println("test1 says blah"); 
    } 

} 

編輯:對不起添加到問題在遊戲中後期,但我有一個閃存的(我認爲):在C#這是不同的?這取決於你有哪些課程think(Test1或Test2)?

回答

3

據我所知,你想要做一些像Test1 b = new Test2(); b.super.blah()。這是無法完成的,super嚴格限於從子類內部調用到超類。

+0

謝謝,我希望那不是真的... – 2010-01-26 10:51:28

2

當你需要這樣的事情時,很難想象情況。

您可以禁止方法覆蓋。
你也可以考慮Template Method模式技術。

+0

是不是'模板方法'只是一個不同名稱的多態性? – 2010-01-26 10:51:03

+0

@yar:是且不是,'template method'是模式的名稱,每個實現的不同之處僅在於一些非常細微的細節,因此並不需要額外/超越代碼來完成他們的工作。與往常一樣,維基百科的例子有點令人困惑,請查看以下兩個鏈接獲取更多信息:http://c2.com/cgi/wiki?TemplateMethod http://www.javapractices.com/topic/TopicAction.do?Id=164 – Esko 2010-01-26 10:55:45

+0

非常好,謝謝Mykola和@Esko – 2010-01-26 11:17:10

3

不,沒有辦法顛覆這種繼承的概念。

+0

謝謝,這就是我所看到的經驗... – 2010-01-26 10:49:03

+0

+1。如果你發現你想做那樣的事情,那麼也許你應該看看對象組合而不是子類化,這爲客戶端代碼提供了更多的靈活性。 – Thilo 2010-01-26 10:58:18

+0

謝謝@Thilo。我通常總是避免子類化,並且更傾向於'具有'到'是'的關係。但是這個例子出現了,只是想知道Java是否提供了這個功能。 – 2010-01-26 11:18:35

1

簡單的答案是:你不能

你可以有嗒嗒是

class Test2 extends Test1 { 
    public void blah() { 
     if("condition"){ 
      super.blah() 
     } 
     System.out.println("test2 says blah"); 
    } 

} 

還是走originalBlah方式,或完全解耦嗒嗒實施能夠調用你需要取其實現,但就是這樣。