[英]How can I call a class in the main program from a library?
我有多个需要编写的程序,它们共享共同的功能/资源。 我正在寻找是否可以将这些程序的大部分内容放入库中。 场景如下:
ProgA,ProgB和ProgC是使用libX的程序。
libX有一个XYZ类,它将实例化一个ABC类。
ProgA,ProgB和ProgC都具有ABC类的不同实现。
如何构造程序以实现这一目标? 我曾尝试进行研究,但找不到答案。 提前致谢...
您可以在库中声明一个公共接口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();
}
});
}
}
看来您需要创建n 个控制反转 。
在这种情况下,您需要libX有一个指向接口ABC的指针,该接口具有您想让libX使用的所有功能,然后,progA,progB和progC必须实现此接口。
在启动程序时,需要转到共享库,然后使用已知方法将正在运行的程序注入到库中,例如:
setProgram(IMyInterface interface) {
this.interface = interface;
}
这样,当您要运行已知的响应操作时,可以运行this.interface.doSomething()
就是这样。
您将仅拥有一个基本的库interface ABC
,该接口提供了允许XYZ
类与均实现interface ABC
的类A
, B
和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
, B
和C
实现要么实现ABC
要么创建动态实现ABC的对象。
对我来说,这听起来很像是回调方案。 Yor库需要一种将结果传达给特定实现的标准方法。 ABC
基本上是一个事件处理程序接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.