Java - 扩展子类中的私有(private)方法

标签 java inheritance

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

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

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

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

最佳答案

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

考虑 Strategy Pattern 的设计。基本上,不需要重写 private 方法,因为这些方法应该为接口(interface)之外的事物保留,并且仅特定于该特定的具体类。

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

关于Java - 扩展子类中的私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070226/

相关文章:

css 继承上面的样式

c++ - 多重继承和重复函数调用

cocoa-touch - 在扩展中添加便利的初始值设定项并在子类上调用它们

JAVA:文字游戏查询

java - 从 HttpServletRequest 解析二进制数据

java - 决策表的口水表现

java - 无法单击 Selenium 中网格上的过滤器

javascript - JS继承在构造函数中覆盖?

java - play2 Java EBean ORM : Inheritance and Generics

java - 变量可能未初始化错误和一般建议