我遇到了在子类中扩展/修改私有方法的麻烦。例如,我正在创建一个从超类继承的模拟对象,以便在测试中使用。
下面是我想要修改的父类的代码示例:
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 ;
}
}
我知道在子类中不能重写私有方法。因此,我应该创建一个具有相同签名的新方法。我还需要重新创建这个类中的所有私有变量吗?但如果我这样做了,我不确定这是否会改变行为,使其与父类不同,因为我知道子类中的父类实际上为私有变量保留了空间。因此,我会有重复的私有变量。我不知道最好的方法是什么。
发布于 2014-09-27 00:57:20
如果您发现需要重写子类中的方法,也许该方法所负责的逻辑足够抽象,足以保证使用public
或protected
方法。
考虑一下Strategy Pattern的设计。基本上,不应该需要覆盖private
方法,因为这些方法应该保留给接口之外的东西,并且只特定于特定的具体类。
对于我来说,像build()
这样完整和具体的东西听起来像是属于protected
方法,您的最高超类可能会在构造过程中的某个时刻使用它,但不应该在外部调用它。当然,如果可以根据需要多次调用build()
(幂等函数)是安全的,就像游戏角色类中的render()
方法一样,那么将其公开并记录您对其实现的期望应该是安全的。
发布于 2014-09-27 01:05:42
尝试使用mocking API,例如Jmockit。
使用它,可以省去很多手工模拟的麻烦,就像你用私有方法扩展类一样!祝好运。
发布于 2014-09-27 00:57:44
我不确定您的程序总体上是如何工作的,但如果您希望所有基类共享相同的方法(?),那么您可能值得研究一下抽象类和方法。
https://stackoverflow.com/questions/26070226
复制相似问题