8

我正在使用用于自动化软件的“宏”的 Java API。除其他外,该 API 具有类Simulation(一种全局状态)和FunctionManager. 我无法修改这些类。

我想做一个BetterFunctionManager类,extends FunctionManager因为后者缺少一些有用的功能。但我不知道该怎么做,因为FunctionManager不能直接实例化。它必须从 获取Simulation,如下所示:

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

注意Simulation也不能直接实例化;它必须通过getCurrentSimulation()(当前模拟由宏解释器在运行时确定)。

我不能沮丧;以下引发 ClassCastException:

BetterFunctionManager betterFunctionManager = simulation.getFunctionManager();

我该如何构建BetterFieldFunctionManager

4

3 回答 3

4

免责声明:我对设计仍然很天真。只是一个建议。使用委托设计模式

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());
于 2013-05-29T13:16:34.600 回答
2

您发现的问题被称为表达式问题,恐怕您使用纯 Java 攻击它的最合理选择是 StinePike 提出的使用组合和委托的建议

If you are in position to choose the tool for the task then I'd recommend you to take a look at Clojure Protocols. They offer a really nice solution to the expression problem (see very good explanation here Solving the Expression Problem with Clojure) and if I'm not mistaken if you end up coding your solution in clojure you can compile it into a java .class and use it in your java app

于 2013-05-29T15:02:38.773 回答
1

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

于 2013-05-29T12:49:36.760 回答