http://blog.csdn.net/blue_morning/article/details/8815609
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);
...
var
ExprotTable: TExportTable;
begin
ExprotTable := TExportTable.Create(nil)
根據AExoprtObjectInfo的數據內容具體化ExportTable對象以方便復用代碼
end;
然后,在具體的業務功能(例如入庫單管理)中需要從TExportTable繼承一個入庫單類
TInStorageBill = class(TExportTable)
一些具體的類屬性和方法
覆蓋TExportTable的Create方法以創建相應的資源
end;
廢話了那么多,問題才終於出現了:“我怎么才能在TTableSet.Add()方法中創建TInStorageBill對象?”或換而言之:“我怎么在在知道父類的情況下創建其不確定的子類?”。 而你們都知道答案了。
類的類在什么時候使用:
知道父類但需要創建具體的子類時(你不知道子類會是什么)
例如:
一個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
