我正在为C ++中基于接口的运行时对象组合寻找一个简单,轻量级的解决方案。我希望能够指定实现这些的接口(方法声明)和对象(可通过工厂模式创建)。在运行时,我希望机制实例化这些对象并基于接口连接器互连这些对象。在运行时调用的方法应该保持相当便宜,即每次调用只有几个指令,与仿函数模式相当。
整个事情需要与平台无关(至少MS Windows和Linux)。解决方案需要获得自由许可,例如开源LGPL或(甚至更好)BSD或其他东西,特别是允许使用商业产品。
我不想要的是网络,进程间通信,额外的编译器步骤(一次性代码生成就可以了),或者对某些重型库(如Qt)的依赖性等重要内容。
具体方案是:我在更大的软件中有这样的机制,但机制实现得不是很好。接口由Dlls导出的基类实现。这些Dll还导出工厂函数,以基于手写的类ID实例化实现对象。
在我开始重新设计并自己实施更好的东西之前,我想知道是否有更好的东西。
编辑:该解决方案还需要支持多线程环境。此外,由于一切都将在同一个过程中发生,因此我不需要任何类型的数据序列化机制。
编辑:我知道这些机制是如何运作的,我知道有几本教学书籍包含相应的例子。我不想自己写。我的问题的目的是:是否存在某种行业标准" lib为此?这是一个小问题(在一个过程中),我真的只是在寻找一个小解决方案。
编辑:我建议添加一个我真正想要做的伪代码示例。所以这就是:
某处我想定义接口。我不在乎它的C-Header或某些语言和代码生成。
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();
}
我完全能够自己编写这样的解决方案(包括所有陷阱)。我正在寻找的是一个解决方案(例如一个库),它由广泛的用户群使用和维护。
答案 0 :(得分:1)
虽然没有广泛使用,但几年前我写了一个图书馆来做这件事。
你可以在GitHub zen-core library上看到它,它也可以在Google Code上找到
GitHub版本只包含核心库,这真的是你所需要的。 Google Code版本包含许多额外的库,主要用于游戏开发,但它确实提供了很多关于如何使用它的好例子。
该实现的灵感来自Eclipse的插件系统,使用一个指示可用插件列表的plugin.xml文件,以及一个指示您要加载哪些插件的config.xml文件。我还想更改它,以便它不依赖于libxml2,并允许您使用其他方法指定插件。
由于一些黑客,文档已被破坏,但如果您认为这有用,那么我可以编写足够的文档来帮助您入门。
答案 1 :(得分:0)
一位同事给了我另外两个提示:
我还没有看到我得到的所有想法。