• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi类的类classof用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

Delphi 类的类 class of 用法

 
这个概念本来在一个关于Delphi RTTI 介绍的文档中已经说得很清楚了。但没有任何关于实际使用的介绍,在我明白了这个概念和如何使用后决定写一个使用说明以方便大家使用。


类的类在什么时候使用:
知道父类但需要创建具体的子类时(你不知道子类会是什么)


例如:
一个Delphi Exe程序中项目文件的Application.CreateForm,跟踪下源代码就能明白,Delphi实现了在根本不知道我们会从TForm派生出什么类的情况下,实现了对这个类的创建。


关键:
  TComponentClass = class of TComponent;

  procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
  begin
    Instance := TComponent(InstanceClass.NewInstance);
    Instance.Create(Self);

    ...

  end;

关键的代码就是加粗的这两句和类的类声明

 

本质:

类的类在声明时,说明相应的类及子类会被编译器附加额外的信息(RTTI),以让系统可以找到具体子类的Create和NewInstance地址。应该就是这样。

代价:

额外的RTTI信息会使我们的类占用额外的内存,这是便利的代价。

 

简单的问题复杂的说明

本来问题已经说明,但还是存在一个问题:我们的代码中什么地方需要使用class of ?我发现这个问题说明起来很复杂,我举个我人个开发使用的例子。在做数据库程序开发时:我先定义一个TTableSet对象,其功能类似DataModule。用于放置TExportTable,TExportTable类其功能类似TDataSet。我定义了它的增、删、改、查等基本操作。TTableSet对象有一个Add方法,大概代码如下:

procedure TTableSet.Add(const AExoprtObjectInfo: record)
var
  ExprotTable: TExportTable;
begin
  ExprotTable := TExportTable.Create(nil)
  根据AExoprtObjectInfo的数据内容具体化ExportTable对象以方便复用代码
end;


然后,在具体的业务功能(例如入库单管理)中需要从TExportTable继承一个入库单类
TInStorageBill = class(TExportTable)
   一些具体的类属性和方法
  覆盖TExportTable的Create方法以创建相应的资源
end;


废话了那么多,问题才终于出现了:“我怎么才能在TTableSet.Add()方法中创建TInStorageBill对象?”或换而言之:“我怎么在在知道父类的情况下创建其不确定的子类?”。 而你们都知道答案了。


欢迎使用 class of

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
(待续)科学计算与MATLAB语言之数据分析发布时间:2022-07-18
下一篇:
在matlab2015b中配置vlfeat-0.9.18发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap