線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1297
推到 Plurk!
推到 Facebook!

對class of 還是有點疑問

尚未結案
chimera
初階會員


發表:62
回覆:78
積分:28
註冊:2003-03-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-28 12:15:11 IP:211.76.xxx.xxx 未訂閱
    class of 就是 metaclass也就是類別中的類別,依照help中的例子:
type TCollectionItemClass = class of TCollectionItem;      ...
constructor Create(ItemClass: TCollectionItemClass); 
中的建構子參數列含有Tcollectionitemclass這個類別
依照我目前的見解是只要屬於Tcollectionitem這個類別以及繼承他的子類別都可以百到那個參數列中,
那這樣的話,跟直接擺Tcollectionitem這個類別到參數列中有何差別呢??
直接擺不也是可以放繼承的子類別到參數列中嗎??     
發表人 -
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-28 13:45:52 IP:218.16.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-30 00:12:18 IP:61.56.xxx.xxx 未訂閱
你好: 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 程 式技術" 一書,檔中有很多的觀念解說,相信能解開很多夥伴一些觀念上的迷思。
系統時間:2024-05-02 17:18:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!