这个观点原来在一个关于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