2015-06-24 67 views
0

我正在尋找解決方案如何使用自定義內容擴展超類的方法。如何使用自定義內容擴展超類的方法

,比如我有一個超類

class A{ 

    public A(){ 
    boolean ok = doSomeInitialWork(); 

    if(ok){ 
     specialMehtod(); 
    } 
    } 

    specialMehtod(){ 
    System.out.print("HEllO"); 
    } 
} 

所以我的A類做了一些 「初始化」 的東西,然後調用specialMehtod()。現在我想擁有class B extends A並將其他代碼添加到specialMehtod()。喜歡的東西:

Class B extends A{ 

    B(){ 
     super(); 
    } 

    specialMehtod(){ 
     System.out.print("BBBBB");  
    } 
} 

但如果我這樣做,我打電話a.SpecialMethod() expizit,實際上我只是想「添加」到System.out.print("BBBBB"); specialMethod(),所以它仍然可以從A的構造方法中調用

我想實現什麼,是finaly我可以在我的主類

new B();

螞蟻輸出會做。因爲B()調用A()的構造函數,它調用由B.specialMethod()擴展的A.specialMethod();

可能嗎?

感謝

+1

不知道我明白你想要做什麼,但如果你重寫B中的someSpecialTask​​方法,它應該不工作? – LBes

+1

您既可以按原樣繼承方法,也可以重寫它。不幸的是,下面的所有答案都爲您提供瞭解決方案,但不回答您的問題。 – zubergu

+0

我編輯我的問題,也許它現在更清楚我想實現什麼 – user1908375

回答

2

你將不得不因此,像這樣:

public abstract class A{ 
    public abstract void anotherMethod(); 

    public A(){ 
     // some stuff.. 
     specialMethod(); 
    } 

    private final void specialMethod(){ 
     System.out.println("specialMethod"); 
     anotherMethod(); 
    } 
} 

public class B extends A{ 
    public B(){ 
     super(); 
    } 

    public void anotherMethod(){ 
     System.out.println("anotherMethod"); 
    } 
} 

這樣,你強迫你的擴展類來實現方法anotherMethod()這種方法是從你的抽象類A調用。如果你的擴展類不需要在anotherMethod()中做任何事情,你可以讓方法體爲空。


正如您的問題的評論中所述,您必須繼承或重寫該方法。重寫某個方法時,必須顯式調用超級方法super.someMethod();,或者在繼承時,不能向給定的方法添加其他功能。
因此,以您的示例來說,如果您沒有在B中執行specialMethod(),它將打印出「HELLO」,因爲A對此方法有實施,但B沒有。如果你覆蓋的方法就像你在做例子在B類:

specialMethod(){ 
    System.out.println("BBBBB"); 
} 

將有「HELLO」不會被打印出來的效果。在這種情況下,A的構造函數將直接調用B.specialMethod()(在B對象的實例上)。如果你不想A.specialMethod()被調用,你必須明確地調用它。所以,不,你不能在沒有明確地調用super.specialMethod()的情況下向超類中實現的方法「添加功能」。

由於這個原因,我已經構建了上述示例作爲解決方法。請注意,我已經更新了代碼。與例如,如果你調用new B();,輸出將是:

specialMethod 
anotherMethod 

而與此解決方案,延伸類沒有明確要叫super.specialMethod(),但它必須實現anotherMethod()。此外,通過製作specialMethod a final方法,B不允許覆蓋specialMethod

+0

謝謝你解釋。我試了一下,它完美地工作。順便說一句,我使用Eclipse,它自動建議我添加anotherMethod()到B類,並把它與@Override註釋。這個註釋只是爲了更好地查看重寫的方法嗎? – user1908375

+0

是的,我不確定@Override註釋的所有好處是什麼,但它肯定比較容易閱讀。創建JavaDoc可能會帶來好處,並且如果您使用[java.lang.reflect](https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary的.html)。 – MalaKa

0

使用abstract方法A。這樣的 -

public class A{ 
    public abstract specialMethod(); 
} 

然後當B延伸AB必須實現specialMethod()由它自己。

相關問題