3

又是我的旧版 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 中是不可能的,我正在寻找其他聪明的想法

4

5 回答 5

2

我想创建一个具有所有 MyManager 功能的类 CustomManager

是的,使用组合

但使用TopManager默认构造函数。

通过使用泛化

class CustomManager extends TopManager { // have all properties of TopManager

  private MyManager myManager; // have all behaviours of MyManager by delegating the call

}
于 2013-05-28T13:49:57.653 回答
1

CustomManager应该继承自TopManager而不是MyManager.

于 2013-05-28T13:46:51.267 回答
1

在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);
     } 
}
于 2013-05-28T13:48:37.300 回答
1

如果星星是正确的,您也许可以使用组合而不是继承。扩展TopManager和实例化 aMyManager以供内部使用。如果您在同一个包中定义类,您将能够访问包私有成员。这与您在扩展MyManager.

于 2013-05-28T13:49:14.473 回答
1

我正在寻找其他好主意

您是否考虑过使用类似cglib的东西?

这是一个相当粗略的想法,但我知道它可以在运行/加载时执行一些与代码生成/修改类相关的邪恶魔法(通常用于模拟/动态 aop 实现)。

我知道我的建议相当骇人听闻,但是一旦被您提到的那个遗留库逼入绝境,它似乎对您来说可能很方便...

于 2013-05-28T13:51:27.767 回答