對class of 還是有點疑問 |
尚未結案
|
chimera
初階會員 發表:62 回覆:78 積分:28 註冊:2003-03-22 發送簡訊給我 |
class of 就是 metaclass也就是類別中的類別,依照help中的例子: type TCollectionItemClass = class of TCollectionItem; ... constructor Create(ItemClass: TCollectionItemClass); 中的建構子參數列含有Tcollectionitemclass這個類別 依照我目前的見解是只要屬於Tcollectionitem這個類別以及繼承他的子類別都可以百到那個參數列中, 那這樣的話,跟直接擺Tcollectionitem這個類別到參數列中有何差別呢?? 直接擺不也是可以放繼承的子類別到參數列中嗎??發表人 - |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
1. 你說得不很清楚
constructor Create(ItemClass: TCollectionItemClass);
是 TCollection 的 Construction 而不是 TCollectionItem / TCollectionItemClass 的 Contructor 2. 你想想當你呼叫
var myCollection : TMyCollection; begin myCollection := TMyCollection.Create(XXX); ... end時,若 XXX 是 TMyCollectionItem 你那來一個 CollectionItem 傳給他 ? 當時連 Collection 也還沒有,甚有 CollectionItem 3. 你知道 ItemClass : TCollectionItemClass 這個參數是甚麼用的嗎? 看看 : function TCollection.Add: TCollectionItem; begin Result := FItemClass.Create(Self); Added(Result); end;若傳入的 TCollectionItem, 一個 Item 能 Create 另一個新 item 嗎?換句例子,我們 Create 新 Form (或任何 object) 都是用 Class 而不是 Object 本身來做的 : Form1 := TForm1.Create(self); //對 Form1 := Form1.Create(self); //錯 Form1.Create(self); //錯 4.總結 有些東西是要 Class 才能做的 (尤期是以一個 Class 來 create 一個 Object Instance) 。就以 TCollection 為例,自己Create 時是沒有任何對應的 Collection Item Instance 的,但他要有 Create item (Add 函數) 的能力,所以你便要傳給他一個 Class of TCollectionItem, 讓他有能力以這個 Class 來新增和管理他的 Collection Item。 多看些 VCL 源碼罷,我自己除數據庫外沒參考書很多慨念都是從VCL學回來的。 |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
MetaClass 是 OP 再多型的一種機制,以下用 TPicture 類型來解釋 MetaClass 的存在目的,
如果表達的不當,也請各位前輩指正。 在 Delphi 中處理圖形的類別如下
TGraphicClass = Class of TGraphic // 所有繼承自 TGraphic 的 Class (包含 TGraphic 自己)
TGraphic // 用來處理圖形的抽象 class TBitmap // 專責處理 BitMap TIcon // 專責處理 Icon TMetafile // 專責處理 Metafile請看以下節錄自 TPicture 的程式碼。 procedure TPicture.LoadFromFile(const Filename: string); var Ext: string; NewGraphic: TGraphic; GraphicClass: TGraphicClass; begin Ext := ExtractFileExt(Filename); // 取出指定檔案的檔型 Delete(Ext, 1, 1); GraphicClass := FileFormats.FindExt(Ext); // FileFormats.FimdExt 會傳回正確的 TGraphic Class if GraphicClass = nil then raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]); NewGraphic := GraphicClass.Create; // 以 GraphicClass 內的 Class 建構圖形物件。 try NewGraphic.OnProgress := Progress; NewGraphic.LoadFromFile(Filename); except NewGraphic.Free; raise; end; FGraphic.Free; // 將舊的圖形物件釋放 FGraphic := NewGraphic; // 以新的圖形物件取代 FGraphic.OnChange := Changed; Changed(Self); end;上列所示,運用 MetaClass 可以讓我們動態的決定使用何種類別,如檔型是 icon 則對應的是 TIcon,檔型 是 BMP 則對應的是 TBitMap。簡單說就是我們不知道需要使用哪一種 Class,但我們肯定一定是 TGraphic 或繼承自 TGraphic 的 Class 。如果大家想更了解這些觀念,不妨找找由李維大師所編的 "高等 Delphi 程 式技術" 一書,檔中有很多的觀念解說,相信能解開很多夥伴一些觀念上的迷思。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |