C 中的运行时接口和对象组成

Runtime interfaces and object composition in C++

本文关键字:对象 接口 运行时      更新时间:2023-10-16

我正在寻找一个简单的,轻量级的解决方案,以用于基于接口的运行时对象组成C 。我希望能够指定实施这些接口(方法声明)和对象(可通过工厂模式创建)。在运行时,我希望机制实例化这些对象并基于接口连接器互连。运行时的方法调用应保持相当便宜,即每个呼叫只有几个说明,可与函子模式相当。

整个过程需要独立于平台(至少是MS Windows和Linux)。该解决方案需要自由许可,例如开源LGPL或(甚至更好)BSD或其他东西,尤其是允许使用商业产品。

我不想要的是诸如网络,过程间通信,额外的编译器步骤(虽然可以进行一次代码还可以)或对某些重型库的依赖(例如QT)等重重的事情。

具体场景是:我在较大的软件中具有这样的机制,但是该机制的实现不是很好。接口是由DLL导出的基类实现的。这些DLL还基于手写类IDS导出工厂功能以实例化实现对象。

我现在开始重新设计和实施更好的东西之前,我想知道是否有更好的东西会更好。

编辑:该解决方案还需要支持多线程环境。此外,由于一切都会发生在同一过程中,因此我不需要任何形式的数据序列化机制。

编辑:我知道这种机制是如何工作的,而且我知道几本教书包含相应的示例。我不想自己写。我的问题的目的是:为此有某种"行业标准" lib?这是一个小问题(在一个过程中),我实际上只是在寻找一个小解决方案。

编辑:我得到了建议,添加一个伪代码的示例,说明了我真正想做的事情。所以这里是:

我想定义接口的地方。我不在乎它是C头还是某种语言和代码生成。

class interface1 {
public:
    virtual void do_stuff(void) = 0;
};
class interface2 {
public:
    virtual void do_more_stuff(void) = 0;
};

然后我想提供(多个)实现。这些甚至可以放置在基于DLL的插件中。尤其是,这两个课程我的实施在两个不同的dll中,在编译时彼此不认识。

class A : public interface1 {
public:
    virtual void do_stuff(void) {
        // I even need to call further interfaces here
        // This call should, however, not require anything heavy, like data serialization or something.
        this->con->do_more_stuff();
    }
    // Interface connectors of some kind. Here I use something like a template
    some_connector<interface2> con;
};
class B : public interface2 {
public:
    virtual void do_more_stuff() {
        // finally doing some stuff
    }
};

最后,我可能希望在运行时撰写我的应用程序逻辑(例如,基于用户输入):

void main(void) {
    // first I create my objects through a factory
    some_object a = some_factory::create(some_guid<A>);
    some_object b = some_factory::create(some_guid<B>);
    // Then I want to connect the interface-connector 'con' of object 'a' to the instance of object 'b'
    some_thing::connect(a, some_guid<A::con>, b);
    // finally I want to call an interface-method.
    interface1 *ia = a.some_cast<interface1>();
    ia->do_stuff();
}

我可以自己编写这样的解决方案(包括所有陷阱)。我正在搜索的是一个解决方案(例如库),该解决方案由广泛的用户群使用和维护。

虽然没有被广泛使用,但几年前我写了一个图书馆。

您可以在GitHub Zen-Core库上看到它,也可以在Google Code

上使用。

github版本仅包含核心库,这实际上是您所需的。Google Code版本包含许多额外的库,主要用于游戏开发,但它确实提供了许多有关如何使用它的好示例。

该实现的灵感来自Eclipse的插件系统,使用插件.xml文件,该插件指示可用插件列表,以及指示您要加载哪个插件的Config.xml文件。我也想更改它,以便它不依赖于libxml2并允许您能够使用其他方法指定插件。

由于一些黑客,该文档已被破坏,但是如果您认为这很有用,那么我可以编写足够的文档来使您开始。

一个同事给了我两个提示:

  1. Loki库(起源于现代C 书):http://loki-lib.sourceforge.net/
  2. 一个像提升的图书馆:http://kifri.fri.uniza.sk/~chochlik/mirror-lib/html/

我仍然没有看过我得到的所有想法。