首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何泛化地传递TForm (这个)?

如何泛化地传递TForm (这个)?
EN

Stack Overflow用户
提问于 2019-08-12 15:51:49
回答 1查看 53关注 0票数 0

我有两个几乎相同的表单(Form4和Form5),它们有几个公共项,但处理不同的数据。我正在尝试编写一个助手函数,它将采用以下两种形式之一。

这两个表单都是动态创建的。

到目前为止,我能够编写处理来自Form4进程(TForm4 *F)的数据的函数。我不能在Form5中这样做,因为助手函数是特定于TForm4的。

来自Form4

代码语言:javascript
复制
 Edit1Exit(Tobject *Sender){     
   Process(this);
 }

来自Form5

代码语言:javascript
复制
 Edit1Exit(Tobject *Sender){     
   Process(this);
 }

 Process(TForm4 *F){
  // Do something like F->BitBtn1->Visible=false;
  }

问题是,Process( )是为TForm4编写的,因此它不接受TForm5。

如何声明Process(),使其采用任何一种形式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 19:21:14

一般来说,您将有三种选择:

  1. 为每个版本编写显式重载,并复制代码。也就是说,
代码语言:javascript
复制
void Process(TForm4* F) {
   /// do things
}

void Process(TForm5* F) {
   /// do things
}
  1. 派生自声明虚拟接口的公共基类,即,
代码语言:javascript
复制
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
}
  1. 使用模板(但在这种情况下,函数的实现在使用时必须是可访问的;这通常意味着它必须驻留在头文件或可以直接包含的文件中),即,
代码语言:javascript
复制
template<typename T>
void Process(T* F) {
    // interact with the classes; assumes a common interface
}

为了简单起见,我省略了许多细节,但这将使您开始工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57464415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档