繁体   English   中英

如何从库中调用主程序中的类?

[英]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的类ABC进行交互的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; }
}

然后,您的ABC实现要么实现ABC要么创建动态实现ABC的对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM