【问题标题】:Java - Extending private methods in subclassesJava - 在子类中扩展私有方法
【发布时间】:2014-11-22 02:16:00
【问题描述】:

我遇到了在子类中扩展/更改私有方法的麻烦。例如,我正在创建一个从超类继承的模拟对象,以便在测试中使用。

这是我想更改的父类代码示例:

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

我知道私有方法不能在子类中被覆盖。因此,我应该创建一个具有相同签名的新方法。我是否还必须重新创建此类中的所有私有变量?但是如果我这样做,我不确定这是否会改变行为与父类不同,因为我知道空间实际上是为子类中父类的私有变量保留的。因此,我会有重复的私有变量。我不知道解决这个问题的最佳方法是什么。

【问题讨论】:

  • 我可能会误解,但是在父级中,您不能将有问题的方法和变量设置为受保护而不是私有吗?

标签: java inheritance


【解决方案1】:

您可以在 subclasses 方法中调用 super(),该方法将调用 superclasses 方法,然后在 subclasses 方法中进行您需要的额外更改。

编辑:错误地阅读了原始问题。如果一个方法在超类中具有功能并且您想扩展或更改它,则不应将其设置为私有。在您的情况下,受保护可能是最好的选择,因为它允许子类使用 super() 扩展它或只是覆盖它。

【讨论】:

    【解决方案2】:

    尝试使用模拟 API,例如 Jmockit

    使用它,可以为您省去很多手工模拟的麻烦,例如在您的情况下使用私有方法扩展类!祝你好运。

    【讨论】:

      【解决方案3】:

      如果您发现需要重写子类中的方法,则该方法负责的逻辑可能足够抽象,足以保证使用publicprotected 方法。

      考虑Strategy Pattern 的设计。基本上,不需要重写 private 方法,因为这些方法应该保留给接口之外的东西,并且只针对特定的具体类。

      在我看来,像 build() 这样完整而具体的东西听起来像是 protected 方法,您的最高超类可能会在构建过程中的某个时候使用它,但不应在外部调用它。当然,如果可以安全地根据需要多次调用build()(幂等),例如render() 方法可能在游戏角色类中,那么将其公开并记录您的期望应该是安全的它的实现。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-05
          • 2018-07-08
          • 2013-07-02
          • 2011-12-06
          • 1970-01-01
          • 2019-03-05
          • 2013-05-20
          • 1970-01-01
          相关资源
          最近更新 更多