2011-09-22 26 views
4

這裏是我的方案:力的基類使用它自己的方法,而不是overrided方法

class SomeBaseClass 
{ 
    public void foo(String str) 
    { 
    ....... 
    } 
    public void foo(String strs[]) 
    { 
    ....... 
    } 
} 

class MyClass extends SomeBaseClass 
{ 
    public void foo(String str) 
    { 
      super.foo(str); 
    } 
    public void foo(String strs[]) 
    { 
      throw new RuntimeException("only one input please!"); 
    } 
} 

的邏輯很簡單。 「SomeBaseClass」是我無法修改的第三方工具。我想限制它的功能並且不想允許foo(String strs [])。

問題是在SomeBaseClass foo(Sting str)內部調用foo(String strs [])。因此,當我調用MyClass的foo(String str)時,我得到一個運行時異常。我怎麼能告訴SomeBaseClassclass使用SomeBaseClass :: foo的(可疑交易報告的字符串[])和所有其他類使用MyClass的:: foo的(可疑交易報告的字符串[])

+0

瘋狂的猜測,你嘗試過'this.foo()'? (儘管我不太瞭解Java) –

回答

2

也許如果是,請撥打super.foo(String)或其他throw RuntimeException

查找來電檢查StackTrace

+2

使用堆棧跟蹤可能會顯着降低性能,但還有另一種方法可以確定是調用super還是拋出錯誤。在'foo(String)'中,可以標記允許超級調用(如果不需要線程安全性或使用ThreadLocal,則使用本地類變量),並檢查'foo(String [])'中的標誌。但包裝是一個更好的做法,並且在線程安全的情況下肯定會更快地工作。 –

+0

好點(abt的標誌),猜測這是最好的選擇,(你應該添加它)。當然也可以使其線程安全(只需付出一點努力)。否則,我確實同意這種表現,但我認爲它是隱含的/明確的。 – Kashyap

+1

堆棧跟蹤和使用標誌都起作用。謝謝Kashyap。 我更喜歡使用堆棧跟蹤。 –

5

考慮編寫一個包裝

class MyClass extends SomeBaseClass 
{ 
    private SomeBaseClass impl = new SomeBaseClass(); 

    public void foo(String str) 
    { 
     impl.foo(str); 
    } 

    public void foo(String strs[]) 
    { 
     throw new RuntimeException("only one input please!"); 
    } 
} 
+3

我認爲應該指出,從SomeBaseClass繼承的每一個方法都必須被轉發到impl,如果SomeBaseClass是供應商決定悄悄地在新版本中添加一個新的成員函數,這將悄然中斷。 – NPE

+1

我在這裏錯過了什麼嗎? 'MyClass'仍然'擴展了SomeBaseClass',所以它究竟是如何停止的:'MyClass.foo(String)' - >'SomeBaseClass.foog(String)' - >'MyClass.foo(String [])' - >'扔......「。得到它了。 :) – Kashyap

+0

這裏'impl.foo(str)'impl是'SomeBaseClass'的一個實例,所以它不會導致MyClass.foo(String [])'。我的原始實現中有 –

相關問題