簡體   English   中英

Java-在子類中擴展私有方法

[英]Java - Extending private methods in subclasses

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

這是我想更改的父類代碼的示例:

 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 ;
        }
}

我知道私有方法不能在子類中覆蓋。 因此,我應該創建一個具有相同簽名的新方法。 我還必須重新創建此類中的所有私有變量嗎? 但是,如果這樣做,我不確定是否會將行為更改為與父類不同,因為我知道實際上為子類中父類的私有變量保留了空間。 因此,我將有重復的私有變量。 我不知道最好的方法是什么。

如果發現需要重寫子類中的方法,則該方法所負責的邏輯可能足夠抽象,可以保證使用publicprotected方法。

考慮戰略模式的設計。 基本上,不需要重寫private方法,因為這些方法應該保留給接口之外的東西使用,並且僅特定於該特定的具體類。

對我來說,像build()一樣不可或缺的東西聽起來像它屬於protected方法,您的最高超類可能在構造過程中的某個時候使用,但不應在外部調用。 當然,如果可以安全地根據需要多次調用build() (冪等),例如render()方法可能在游戲角色類中,那么將其公開並記錄您的期望是安全的它的實現。

嘗試使用模擬 API,例如Jmockit

使用它,可以省去很多手工模擬的麻煩,例如在使用私有方法擴展類的情況下! 祝好運。

我不確定您的程序總體上如何工作,但是如果您希望所有基類共享相同的方法,那么您可能值得研究抽象類和方法(?)

您可以在subclasses方法中調用super(),該方法將調用superclasses方法,然后在subclasses方法中進行所需的額外更改。

編輯:錯誤地閱讀原始問題。 如果方法在超類中具有功能,並且您想擴展或更改它,則不應將其設置為私有。 在您的情況下,Protected是最好的選擇,因為它允許子類使用super()對其進行擴展或僅重寫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM