向类及其所有子类添加功能
Add functionality to class and all of it's subclasses
我有3个类,它们继承自3个不同的类,这些类都继承自QWidget
基类。例如:
MyMainWindow : public QMainWindow : public QWidget
MyPushButton : public QPushButton : public QWidget
MyTextEdit : public QTextEdit : public QWidget
我最终会有更多这样的课程。我现在想做的是向我的所有类添加一个通用方法;这意味着它应该被添加到QWidget
基类中,但我不能编辑它(我宁愿不为一个方法更改Qt源代码)。
这种行为可能吗?我已经尝试过使用这样的接口:
class MyTextEdit : public QTextEdit, IMyMethodContainer { ... };
但问题是,我需要在IMyMethodContainer
中访问QObject::connect(sender, signal, this, slot);
,而通过this
,我试图访问MyTextEdit
,而不是IMyMethodContainer
,它不是QWidget
的子类。
CRTP可能会有所帮助。
template<typename Derived, typename Base>
struct InjectMethod: Base {
static_assert( std::is_base_of< InjectMethod<Derived,Base>, Derived >::value, "CRTP violation" );
Derived* self() { return static_cast<Derived*>(this); }
Derived const* self() const { return static_cast<Derived*>(this); }
void my_method() {
// use self() inside this method to access your Derived state
}
};
然后:
class MyTextEdit: InjectMethod< MyTextEdit, QTextEdit > {
};
class MyPushButton: InjectMethod< MyPushButton, QPushButton > {
};
在InjectMethod< MyTextEdit, QTextEdit >
内部,您可以访问一个self()
指针,该指针可以访问MyTextEdit
内部和InjectMethod< MyPushButton, QPushButton >
内部的所有内容。
您可能不需要Derived
部分——如果您只使用QWidget
功能,那么可能只有一个模板参数(您的基础)就足够了。
在Java中,您可以"扩展"QWidget并在那里添加自定义方法。
Class MyQWidgetExtension extends QWidget { ... }
您的其他类(QMainWindow、QpushButton、QtextEdit)只是从中扩展("inherit")。C++也有类似的东西吗?
Class MyQWidgetExtension : public QWidget { ... }
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- C++ 将子类的对象添加到父类的向量中
- 使用哪种模式来执行新代码,只需添加基类的新子类?
- 构造添加了成员变量的子类
- C++将静态多态类自添加到子类的 constexpr 列表中
- 将私有子类添加到q_declare_metatype
- 将子类添加到基类向量C++不起作用
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- 将方法添加到与继承方法相同的子类
- 将构造函数添加到boost.python子类导致参数不匹配错误
- 将子类添加到基类向量
- 如果我希望子类向父类添加功能,我是否应该保护我的属性
- X 的任何子类的专用类模板,无需向模板添加其他类型参数
- C++在多态子类中添加虚拟方法
- 向类及其所有子类添加功能