7

在很多情况下,我想重写一个 Qt 类来扩展或修改它的行为。但几乎所有的 Qt 类都使用内部私有类,例如 QNetworkDiskCache 内部的 QNetworkDiskCachePrivate。我知道这种方法有一些优点。但是私有类有一个巨大的问题:它使覆盖类变得更加困难。对于其他带有源代码的 C++ 类库,我通常会重写一个类方法,从父类的实现中复制代码,并在这里和那里进行一些小的修改以实现我想要的行为。但是,在 Qt 中,私有类不会被导出并且对派生类不可见。由于 Qt 类通过“d”成员在私有类中维护关键的内部数据,私有内部类的不可见性使得行为扩展的可能性非常有限。您只能使用少数公开的公共方法。

我尝试提取类的整个源文件并重命名类名和文件名。但是 Qt 类库如此紧密地交织在一起,以至于在大多数情况下,从中提取一个类也很麻烦。

我在这里想念什么吗?或者 Qt 类在可扩展性方面真的很糟糕?

4

2 回答 2

1

Qt 类在可扩展性方面优于大多数类;他们经常有钩子来改变他们的行为,而无需复制和粘贴整个方法。话虽如此,如果普遍接受的扩展方法不起作用,是的,Qt 类更难破解。这可能是一件好事,因为复制粘贴和修改基类实现意味着您的派生类不会得到基类实现中的任何改进或错误修复。

如果你想这样做,你需要说服你的构建系统让你包含私有头文件,然后从你的新实现中引用私有类。注意 Qt 文档中的免责声明;当您这样做时,您将面临每一个发布的 Qt 新版本的破坏(Qt 只保证公共 API,而您正在搞乱它的内部结构)。Qt 的公共 API 具有极好的可读性和文档化;内部代码可能非常神秘,所以你真的非常想确保你不能用公共 API 完成你想要的。如果您仍然决定使用私有类的东西,这可能会有所帮助

于 2012-10-17T14:40:59.700 回答
-2

你的方法是错误的和坏的!要扩展 Qt 以及更通用的 C++ 代码,您不必复制源代码并在需要的地方修改它。您应该(必须)使用扩展 OOP(面向对象编程)范式。在 C++ 中,您应该编写如下内容:

#include <iostream>

using namespace std;

class A
{
public:
    A(){x=1;}
    void writeName(){cout << "my name is A";}
    void writeNumber(){cout << "my number is " << x << endl;}
private:
    int x;
};

class B : public A
{
public:
    B(){}
    void writeName(){cout << "my name is B and i'm better then A" << endl;}
};

int main()
{
   B *b= new B();
   b->writeName();
   b->writeNumber();
   return 0;
}

//output:
my name is B and i'm better then A
my number is 1

通过这种方式,B 完成了基类 A 所做的所有事情,并且您添加了方法(扩展基类)以满足您的需求。如果您查看 qt 示例代码,这通常是用于执行默认 qt 小部件行为中未包含的操作的方法。在示例 ItemDelegate 自定义项中:您编写自己的类 MyItemDelegate 扩展 QItemDelegate:链接

或者 Qt 类在可扩展性方面真的很糟糕?

Qt 是“唯一”一个构建 C++ 语言的框架。这意味着您可以在 C++ 中完成的所有操作都可以在 Qt 中完成。

于 2012-10-17T09:28:26.957 回答