又是我和我的传统Java应用程序。我有一个核心类,它处理应用程序中的许多重要逻辑。让我们称其为MyManager。MyManager继承自库中的类,我们称其为TopManager。约束是您不能修改这些定义中的任何一个。
public class MyManager extends TopManager {
public MyManager(String a, String b){
super(a);
initialize(b);
}
public MyManager(){
this(null,null);
}
private void initialize(String b){
//specific implementation
}
}
public class TopManager {
public TopManager(String s){
//some implementation
}
}
我想创建一个拥有所有MyManager功能但使用TopManager默认构造函数的类CustomManager。
public class CustomManager extends MyManager
public CustomManager(){
//super(); NO should call TopManager constructor
}
因为这在Java中是不可能的,所以我在寻找其他好的想法
发布于 2013-05-28 13:49:58
我想创建一个具有所有MyManager功能的类CustomManager
是,使用composition
,但使用
TopManager
默认构造函数。
通过使用generalization
class CustomManager extends TopManager { // have all properties of TopManager
private MyManager myManager; // have all behaviours of MyManager by delegating the call
}
发布于 2013-05-28 13:46:51
您的CustomManager
应该继承自TopManager
而不是MyManager
。
发布于 2013-05-28 13:48:37
在java中这是不可能的,这是有原因的。如果您设法绕过调用直接超类的构造函数,则实际上创建了无效的实例。CustomManager
的实例也是MyManager
。如果未调用MyManager
的构造函数,则不会对其进行初始化。
这意味着您不能绕过它,除非向MyMaanger
报告您想要这样做。“报告”是什么意思?这意味着MyMaanger
应该知道您想绕过它的正常初始化。您可以通过使用特殊的布尔标志公开构造函数来完成此操作,该标志指示您是否需要正常初始化:
public class MyManager extends TopManager {
public MyManager(boolean skipInit) {
this(false);
}
protected MyManager(boolean skipInit) {
super();
if(skipInit) {
return;
}
// init
}
}
public class CustomManager extends MyManager {
CustomManager() {
super(true);
}
}
https://stackoverflow.com/questions/16793588
复制