c++ - 在定义自定义接口(interface)时继承库类

标签 c++ oop qt

我遇到了以下设计问题:

我正在为一个应用程序使用 Qt C++ 库。在这个库中有所有继承自 QAbstractItemModel 的“模型”类(如 QAbstractTableModelQStandardItemModel 等)。我想继承其中的几个类,但定义我自己的接口(interface),它们必须共享。

我目前这样做的方法是定义一个接口(interface)(纯虚拟类)并让继承类也从该接口(interface)继承。例如,假设我希望一个类继承自 QAbstractTableModel 以具有 doSomething 函数:

class MyInterface {
public:
    virtual void doSomething() = 0;
}
class MyModel : public QAbstractTableModel, public MyInterface {
    ...
}

但是,我只想将对象作为 QAbstractItemModel 传递。要使用接口(interface)类,我必须将它们转换为 MyInterface 对象,然后调用函数,这会导致到处都是转换。此外,如果其他人使他们自己的类继承自 QAbstractItemModel,那么如果他们不继承该接口(interface),则似乎存在出错的余地。

我可以使用更好的设计来完成这一切吗?

最佳答案

您使用的是哪种铸件?如果你使用 dynamic_cast,你的代码不会看起来更好,但如果你总是检查转换的空结果,你至少应该可以接受非接口(interface)类的可能错误。

当有大量可能的类(如 MyModel)时,这会变得更加复杂,因为您不能直接从 QAbstractTableModel 强制转换(动态或静态)到 MyInterface - 您需要尝试全部强制转换为接口(interface)类稍后的。一种解决方案可能是使用一些模板技巧 -

class MyInterface {
public:
    virtual void doSomething() = 0;
}

template <typename T>
class MyTemplatedInterface: public T, public MyInterface {
private:
    virtual void foo(){}; // might be neceseary to be able to dynamic_cast to this type
}

class MyModel: public MyTemplatedInterface<QAbstractTableModel>{
public:
virtual void doSomething(){};
}

这样,如果您获得 QAbstractTableModel 指针并想知道它是否实现了 MyInterface,您只需转换为 MyTemplatedInterface,而不管实际的基本实现类型是什么。这种设计有几个缺陷,比如无法处理多个接口(interface)或声明模板类的构造函数——其中大部分将在 c++0x 中删除,但此时没有编译器实现足够的它来编写依赖于它的代码.

关于c++ - 在定义自定义接口(interface)时继承库类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439188/

相关文章:

c++ - 在没有 stdio 的情况下将数字转换为字符串 C

java - 在两个类之间发送时丢失数据

c++ - QTabBar 下的小部件带有不需要的框架

Qt:如何检测正在使用的 OpenGL 版本?

c# - 在我的表单中显示另一个应用程序

C++ 部分排序因 2 个模板参数而失败

java - 有什么方法可以在构造函数中初始化需要 "this"作为参数的对象吗?

c++ - Qt 中的错误消息和更好组织的代码

c++ - Qt-Creator 无法解析通用 Qt-project,但包含 OK

javascript - 如何在 JavaScript 中检测数组中的对象属于哪个类