我遇到了以下设计问题:
我正在为一个应用程序使用 Qt C++ 库。在这个库中有所有继承自 QAbstractItemModel
的“模型”类(如 QAbstractTableModel
、QStandardItemModel
等)。我想继承其中的几个类,但定义我自己的接口(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/