2012-09-04 93 views
2

這就是我想要做的事:的Java:調用從第二派生類的基類方法

class A { 
    void myMethod() { 
     // execute A 
    } 
} 

class B extends A { 
    void myMethod() { 
     // execute B 
    } 
} 

class C extends B { 
    void myMethod() { 
     // execute C 
     // execute myMethod in A, without touching myMethod in B OR both 
    } 
} 

我想有條件做到這一點,那就是有時叫什麼在裏面myMethodB其他時間沒有,但總是撥myMethodA

通過調用Csuper.myMethod()我得到的BmyMethod,但我只想要AmyMethod。那可能嗎?我聽說過「虛擬」的東西,但我不知道如何使用它們。

+3

聽起來更像是一個設計問題。在任何情況下,你都可以調用'super'來獲得B的方法,並且使用B的方法中的邏輯來判斷它是否應該調用* its * super(A的方法)以及運行它自己的邏輯。 –

回答

3

不,在Java中是不可能的。類B覆蓋並因此隱藏myMethod的執行A進一步派生類。允許C調用myMethodA將違反此封裝。考慮B.myMethod在內部調用A.myMethod之前執行一些更新的情況,這對於B的正確功能是重要的。如果沒有這些更新,B的合同可能會被違反。因此,在調用B.myMethod時,不應該可以在派生類中調用A.myMethod

通常,如果你想做這樣的事情,你的設計是有缺陷的。

當然,你可以做一些類似於Dave在評論中建議的東西:你可以改變B.myMethod的實現來呼叫A.myMethod。這沒關係,因爲B保留了何時調用A.myMethod的控制權。因此,它可以保證合同不受侵犯。

另一個想法是將你想要的行爲從A分解成另一種方法並稱之爲另一種方法。

+0

我同意,但不知何故,結果是這樣,我會找到另一種方式去做我正在做的事情。 – Solenoid

0

如果你需要這個,A.myMethod()可能確實太多了。嘗試將其重構爲幾個訪問級別爲protected的較小方法。

允許您從BC中調用這些方法。

0

雖然我同意可能更改設計的大多數答案,但直接回答您可以將一個變量布爾值傳入第一個方法。 B方法中的全部邏輯應該依賴於依賴於布爾值的條件if語句。確保在此if語句之外調用super.myMethod()。

事情是這樣的:

void myMethod(boolean execB) { 
// execute B 
super.myMethod(execB); 
    if(execB) 
    { 
     //B logic 
    } 
} 

但是,這是不是,最好的做法,因爲只有B的方法是使用變量,因此爲什麼重構設計可能是一個很好的決定。

相關問題