扩展由另一个类实例化的类

时间:2013-05-29 12:37:35

标签: java constructor extends

我正在使用用于“宏”的Java API来自动化一个软件。除其他外,API还包含类Simulation(全局排序状态)和FunctionManager。我无法修改这些类。

我想创建BetterFunctionManagerextends FunctionManager,因为后者缺少一些有用的功能。但我不知道如何做到这一点,因为FunctionManager无法直接实例化。它必须来自Simulation,如下所示:

Simulation simulation = getCurrentSimulation();
FunctionManager functionManager = simulation.getFunctionManager();

请注意,Simulation也无法直接实例化;必须通过getCurrentSimulation()获取(当前模拟由宏解释器在运行时确定)。

我无法垂头丧气;抛出一个ClassCastException:

BetterFunctionManager betterFunctionManager = simulation.getFunctionManager();

如何构建BetterFieldFunctionManager

3 个答案:

答案 0 :(得分:4)

免责声明:我对设计仍然很天真。只是一个建议。使用delegation design pattern

public class BetterFunctionManager{
    private FunctionManager fm;
    public  BetterFunctionManager(FunctionManager fm){
        this.fm = fm;
    }

    existingMethods(){
        fm.existingMethods();
    }

    newMethods(){
        // new implementation
    }
}

<强>缺点:

需要包装FunctionManager的所有方法

<强>优势:

没有必要在任何其他地方进行更改。只是改变

BetterFunctionManager betterFunctionManager = 
                 new BetterFunctionManager (simulation.getFunctionManager());

答案 1 :(得分:2)

您发现的内容被称为The Expression Problem,我担心使用纯Java攻击它的最合理选择是StinePike使用合成和委派的提议

如果您有能力为该任务选择工具,那么我建议您查看Clojure Protocols。它们为表达式问题提供了一个非常好的解决方案(请参阅Solving the Expression Problem with Clojure中的非常好的解释)如果我没有弄错如果你最终在clojure中编写解决方案,你可以将它编译成java .class并使用它在你的Java应用程序

答案 2 :(得分:1)

由于类结构限制您的选项,如何创建FunctionManagerUtility类而不是BetterFunctionManager。在FunctionManagerUtility类中,您可以通过将FunctionManager对象作为输入来添加添加有用功能的方法。