我正在使用用于“宏”的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
?
答案 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对象作为输入来添加添加有用功能的方法。