我正在使用该工具为我的 D-Bus 服务器qdbusxml2cpp
生成D-Bus 适配器类。但是,它有以下缺点:
代码生成一次,然后你不应该修改它。但是如果我们必须进行更改(见下文)然后 XML 更改(当然以向后兼容的方式)怎么办?
假设“适配者”具有与 D-Bus 接口完全相同的功能和签名。就我而言,这并不完全正确,例如,某些方法的名称不同。因为生成的代码使用
QMetaObject::invokeMethod
,这仅在运行时被检测到。如果将来可能需要重新生成生成的代码,我们也不能明智地修改它。
qdbusxml2cpp
在我看来,如果能生成一个抽象类,只是一个标题,其中所有方法都是纯虚拟的,那就更好了。然后我可以编写该类的实现,它只调用适配者上的正确方法,而无需通过 Qt 元类型系统。这解决了两个问题:
如果 XML 发生变化,我们只需重新生成标头。现在编译器会抱怨,直到我们正确实现新接口。
我们可以自由地在“adaptee”类上调用我们喜欢的任何函数,而不是维护与公共 D-Bus 接口中完全相同的签名。
我找不到qdbusxml2cpp
执行上述操作的任何工具或叉子。在我自己编写之前,上述方法是否存在我可能忽略的设计或技术问题?也许与抽象类或纯虚函数相关的元类型系统的限制?
请注意,我不仅需要使用方法,还需要使用属性和信号。
我还考虑编写一个“中间”适配器来包装“适配器”并提供 D-Bus 适配器所期望的确切接口,但 D-Bus 适配器仍将使用元类型系统和运行时检查。我们当然可以做得更好。