1

我需要编写多个共享通用功能/资源的程序。我正在寻找是否可以将这些程序的很大一部分放入库中。场景如下:

ProgA、ProgB 和 ProgC 是使用 libX 的程序。

libX 有一个类 XYZ,它将实例化一个类 ABC。

ProgA、ProgB 和 ProgC 都有 ABC 类的不同实现。

我如何构建我的程序来实现这一点?我试图进行研究,但无法找到答案。提前致谢...

4

3 回答 3

0

您可以在您的库中声明一个公共接口ABCInterface,其中包含操作您的库所需的所有方法。然后,您的不同程序将声明其ABC实现此接口的类并将引用传递给您的库的方法。

如果您需要在库中实例化类(一次或多次),您可以将引用传递给工厂而不是类实例本身。以下代码可能会让您了解如何实现此类功能。

// Library code
interface ABCInterface {
    public int getValue();
}

interface ABCFactory {
    public ABCInterface createInstance();
}

class Library {
    public static void doWork(ABCFactory factory) {
        ABCInterface obj = factory.createInstance();
        System.out.println(obj.getValue());
    }
}


// Program code
class Program {
    class ABCImplementation implements ABCInterface {
        @Override
        public int getValue() {
            return 42;
        }
    }

    public void useLibrary() {
        Library.doWork(new ABCFactory() {
            @Override
            public ABCInterface createInstance() {
                return new ABCImplementation();
            }
        });
    }
}
于 2013-04-04T06:48:29.280 回答
0

似乎你需要创建 n个控制反转
在这种情况下,您需要 libX 具有指向接口 ABC 的指针,该接口具有您希望 libX 使用的所有功能,然后 progA、progB 和 progC 必须实现此接口。

当您启动程序时,您需要转到共享库并使用已知方法将正在运行的程序注入到库中,例如:

setProgram(IMyInterface interface) { 
    this.interface = interface; 
}

这样,当您想运行已知的响应操作时,您就运行了this.interface.doSomething(),仅此而已。

于 2013-04-04T06:51:07.667 回答
0

您将拥有一个基本库,该库interface ABC提供了允许您的XYZ类与类交互的接口AB并且所有这些类C都实现了interface ABC

public interface ABC {
    public void method1();
    public void method2();
}

然后,您的库类只需要引用一个实现interface ABC.

public class XYZ {
    private ABC abc;
    public XYZ(ABC abc) { this.abc = abc; }
}

然后你的A,BC实现要么实现ABC或创建动态实现 ABC 的对象。

对我来说,这听起来很像回调方案。你的库需要一种标准的方式来将结果传达给特定的实现。ABC基本上是一个事件处理程序接口。

于 2013-04-04T07:03:37.380 回答