2014-09-27 59 views
0

我遇到了在子類中擴展/改變私有方法的麻煩。例如,我正在創建一個從超類繼承的模擬對象,以便用於測試。Java - 在子類中擴展私有方法

這裏是從父類中的代碼,我想改變的例子:

private void build(int skill) { 
     // switch screen 
     state = Constants.STATE_GENERATING; 
     percentdone = 0; 
     notifyViewerRedraw() ; 
     // select generation method 
     switch(method){ 
     case 1 : mazebuilder = new MazeBuilderPrim(); // generate with Prim's algorithm 
     break ; 
     case 0: // generate with Falstad's original algorithm (0 and default), note the missing break statement 
     default : mazebuilder = new MazeBuilder(); 
     break ; 
     } 
} 

我知道私有方法不能在子類中重寫。所以我應該創建一個相同簽名的新方法。我是否也必須重新創建這個類中的所有私有變量?但如果我這樣做,我不確定這是否會改變行爲與父類不同,因爲我知道空間實際上是保留給子類中父類的私有變量。因此,我會有重複的私有變量。我不知道最好的辦法是如何處理這個問題。

+0

我可能會誤解,但在父母你不能讓有問題的方法和變量保護而不是私人? – 2014-09-27 00:57:40

回答

2

如果您發現需要重寫子類中的方法,那麼方法負責的邏輯可能足夠抽象以保證方法publicprotected

考慮設計Strategy Pattern。基本上,應該不需要重寫private方法,因爲這些方法應該保留用於接口之外的事物,並且只針對特定的具體類。

對我而言,它與build()一樣整體和特殊,好像它屬於protected這種方法,您的最高超類可能會在施工過程中的某個點使用,但不應在外部調用。當然,如果可以根據需要多次撥打build()(冪等性),就像render()方法可能在遊戲角色類中一樣,那麼將它公開並記錄您的期望是什麼,這應該是安全的。

0

林不知道如何使你的程序運行的整體,但如果你希望所有的基類的共享相同的方法(?)

0

你可以調用超它可能是值得你尋找到抽象類和方法()在將調用超類方法的子類方法中,然後在子類方法中進行額外的更改。

編輯:原來的問題看錯了。如果一個方法在超類中具有功能,並且想要擴展或改變它,則不應將其設置爲私有。受保護的可能是您的情況中最好的選擇,因爲它允許子類使用super()擴展它或者覆蓋它。

1

嘗試使用模擬API,例如Jmockit

使用它,可以爲您節省很多麻煩,比如在您的情況下使用私有方法擴展類!祝你好運。