我如何一般地传递 TForm (this)?
How do I pass a TForm (this) generically?
我有两个几乎相同的表单(Form4 和 Form5),它们有几个共同的项目但处理不同的数据。
我正在尝试编写一个将采用这些形式之一的辅助函数。
两种形式都是动态创建的。
到目前为止,我能够编写处理来自 Form4 [Process(TForm4 *F)] 的数据的函数。我不能从 Form5 做同样的事情,因为辅助函数是特定于 TForm4 的。
来自 Form4
Edit1Exit(Tobject *Sender){
Process(this);
}
来自 Form5
Edit1Exit(Tobject *Sender){
Process(this);
}
Process(TForm4 *F){
// Do something like F->BitBtn1->Visible=false;
}
问题是 Process( ) 是为 TForm4 编写的,因此它不接受 TForm5。
如何声明 Process() 以便它采用任一形式。
一般来说,你会有三种选择:
- 为每个版本写一个显式重载,并复制代码。即,
void Process(TForm4* F) {
/// do things
}
void Process(TForm5* F) {
/// do things
}
- 从声明虚拟接口的公共基础 class 派生,即
class TFormBase {
// common virtual interface, and a virtual destructor
};
class TForm4 : public TFormBase {
// implementation of the interface + data members
};
class TForm5 : public TFormBase {
// implementation of the interface + data members
};
void Process(TFormBase* F) {
// interact with F via the virtual interface
}
- 使用模板(但在那种情况下,函数的实现必须在使用它的地方可以访问;通常这意味着它必须存在于头文件或可以直接包含的文件中),即,
template<typename T>
void Process(T* F) {
// interact with the classes; assumes a common interface
}
为简单起见,我省略了很多细节,但这应该能让您入门。
我有两个几乎相同的表单(Form4 和 Form5),它们有几个共同的项目但处理不同的数据。 我正在尝试编写一个将采用这些形式之一的辅助函数。
两种形式都是动态创建的。
到目前为止,我能够编写处理来自 Form4 [Process(TForm4 *F)] 的数据的函数。我不能从 Form5 做同样的事情,因为辅助函数是特定于 TForm4 的。
来自 Form4
Edit1Exit(Tobject *Sender){
Process(this);
}
来自 Form5
Edit1Exit(Tobject *Sender){
Process(this);
}
Process(TForm4 *F){
// Do something like F->BitBtn1->Visible=false;
}
问题是 Process( ) 是为 TForm4 编写的,因此它不接受 TForm5。
如何声明 Process() 以便它采用任一形式。
一般来说,你会有三种选择:
- 为每个版本写一个显式重载,并复制代码。即,
void Process(TForm4* F) {
/// do things
}
void Process(TForm5* F) {
/// do things
}
- 从声明虚拟接口的公共基础 class 派生,即
class TFormBase {
// common virtual interface, and a virtual destructor
};
class TForm4 : public TFormBase {
// implementation of the interface + data members
};
class TForm5 : public TFormBase {
// implementation of the interface + data members
};
void Process(TFormBase* F) {
// interact with F via the virtual interface
}
- 使用模板(但在那种情况下,函数的实现必须在使用它的地方可以访问;通常这意味着它必须存在于头文件或可以直接包含的文件中),即,
template<typename T>
void Process(T* F) {
// interact with the classes; assumes a common interface
}
为简单起见,我省略了很多细节,但这应该能让您入门。