我遇到了在子类中扩展/更改私有方法的麻烦。例如,我正在创建一个继承自超类的模拟对象,以便在测试中使用。
以下是我想要更改的父类代码示例:
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 :(得分:2)
如果您发现需要覆盖子类中的方法,那么方法负责的逻辑可能足以保证public
或protected
方法。
考虑Strategy Pattern的设计。基本上,不应该需要覆盖private
方法,因为这些方法应该保留给接口之外的东西,并且只针对特定的具体类。
对我来说,像build()
这样整体和具体的东西听起来像是属于protected
方法,你的最高超类可能会在构造过程中的某个时刻使用它,但不应该在外部调用。当然,如果根据需要多次调用build()
(幂等)是安全的,就像render()
方法可能在游戏角色类中一样,那么将其公开并记录下来应该是安全的你的期望是它的实施。
答案 1 :(得分:1)
尝试使用模拟API,例如Jmockit。
使用它,可以省去手工模拟的麻烦,就像在你的情况下使用私有方法扩展类一样!祝你好运。
答案 2 :(得分:0)
我不确定你的程序总体如何工作但是如果你想让所有的基类共享相同的方法,你可能值得研究抽象的类和方法(?)
答案 3 :(得分:0)
您可以在子类方法中调用super(),该方法将调用超类方法,然后在子类方法中进行所需的额外更改。
编辑:错误地阅读原始问题。如果某个方法在超类中具有功能并且您想要扩展或更改它,则不应将其设置为私有。受保护可能是你的情况下最好的选择,因为它允许子类使用super()扩展它或只是覆盖它。