类的类在什么时候使用:
知道父类但需要创建具体的子类时(你不知道子类会是什么)
例如:
一个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对象?”或换而言之:“我怎么在在知道父类的情况下创建其不确定的子类?”。 而你们都知道答案了。