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

Jea*_*ett 8 java constructor extends

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

我想BetterFunctionManager上课,extends FunctionManager因为后者缺乏一些有用的功能.但我不知道该怎么做,因为FunctionManager无法直接实例化.它必须得到Simulation,像这样:

Simulation simulation = getCurrentSimulation();
FunctionManager functionManager = simulation.getFunctionManager();
Run Code Online (Sandbox Code Playgroud)

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

我不能垂头丧气; 以下抛出ClassCastException:

BetterFunctionManager betterFunctionManager = simulation.getFunctionManager();
Run Code Online (Sandbox Code Playgroud)

我该如何构建BetterFieldFunctionManager

sti*_*ike 4

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

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

    existingMethods(){
        fm.existingMethods();
    }

    newMethods(){
        // new implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

缺点:

需要包装FunctionManager的所有方法

优势:

其他地方不需要改变。只是改变像

BetterFunctionManager betterFunctionManager = 
                 new BetterFunctionManager (simulation.getFunctionManager());
Run Code Online (Sandbox Code Playgroud)

  • 确实是个好主意,这种机制称为委托。;) 它应用了优先组合而非继承的原则。 (2认同)