在许多情况下,我想覆盖Qt类来扩展或修改它的行为.但是几乎所有Qt类都使用QNetworkDiskCache中的内部私有类,如QNetworkDiskCachePrivate.我知道这种方法有优点.但私人阶层存在一个巨大的问题:它使得超越班级变得更加困难.对于带有源代码的其他C类库,我通常会覆盖一个类方法,从父类的实现中复制代码,并在此处进行小的修改以实现我想要的行为.但是,在Qt中,私有类不会导出,并且对派生类不可见.由于Qt类通过“d”成员维护私有类中的关键内部数据,因此私有内部类的不可见性使得行为扩展的可能性非常有限.您只能使用少数暴露的公共方法.
我尝试提取类的整个源文件并重命名类名和文件名.但Qt类库交织在一起,以至于在大多数情况下从中提取单个类也很混乱.
我在这里想念一下吗?或者Qt类在可扩展性方面真的很糟糕?
解决方法
在可扩展性方面,Qt类比大多数类更好;他们经常有钩子来改变他们的行为而不需要复制和粘贴整个方法.话虽如此,如果普遍接受的扩展方法不起作用,是的,Qt类更难以破解.这可能是件好事,因为复制粘贴和修改基类实现意味着派生类不会得到基类实现中的任何改进或错误修正.
如果你想这样做,你需要说服你的构建系统让你包含私有头,然后从你的新实现中引用私有类.注意Qt文档中的免责声明;当你这样做的时候,你正在打开自己的每一个新版本的Qt(Qt只保证公共API,你正在弄乱它的内部). Qt的公共API具有非常好的可读性和记录性;内部代码可能非常神秘,所以你真的,真的想确保你无法用公共API完成你想要的东西.如果你仍然决定使用私人类的东西,this might help.