問題: 書中寫到: -------------------- 類的引用是一種類型,它不是對對象的引用,也不是對類的引用, 而是對類的類型的引用。類的引用類型定義了引用變量的類型。 假設用戶定義了一個類: type CMyClass=class ... end 下面定義一個新類的引用類型,與下面的類相關: type MyClassRef=calss of CMyClass 這樣就聲明瞭兩個類型的變量: aClassRef:MyClassRef; aObject:CMyClass; 其中第一個變量引用一個對象,第二個引用類: aClassRef=CMyClass; aObject=CMyClass.Create; -------------------- 這一段我看不明白,請各位解釋一下。謝謝 |
來自:Pipi., 時間:2002-2-8 23:13:00, ID:916427 |
另外舉一個例子吧,比如我可以寫一個函數 type TControlClass = class of TControl; procedure insert_control(cls:TControlClass); begin obj;=cls.Create(Application); 把obj放進form end; 調用的時候,如果是 insert_control(TEdit) 那麼放進form的是一個編輯框 如果是 insert_control(TButton) 那麼放進form的是一個按鈕 謝複雜一點就是 var ctl:TControlClass; ctr:=TEdit; insert_control(ctl) ------------------------------ 注意上面我們用到TButton和TEdit它們都有共同的祖先TControl 我們定義一個基類,然後通過傳遞不同的子類,那麼一個函數只寫一次就實現不同的效果 |
來自:Holyowl, 時間:2002-2-8 23:26:00, ID:916440 |
類引用的用途就是創建在編譯器無法確定的對象,舉個列子: Type TControlCls = Class of TControl; function CreateComponent(ControlCls: TControlCls): TControl; begin result:=ControlCls.Create(Form1); ... end; 調用時如: CreateComponent(TMemo);//創建TMemo對象 CreateComponent(TEdit);//創建TEdit對象 |
來自:renrf, 時間:2002-2-9 0:07:00, ID:916478 |
謝謝, 我書上的例子怎樣理解呢? |
來自:Pipi., 時間:2002-2-9 0:29:00, ID:916503 |
你書上的例子就更簡單了,根本沒講到實際的用途 就是出現aClassRef的地方你把它看成CMyClass好了 |
來自:testnet, 時間:2002-2-16 1:17:00, ID:923102 |
提前提前,我還沒看明 Type TControlCls = Class of TControl; function CreateComponent(ControlCls: TControlCls): TControl; begin result:=ControlCls.Create(Form1); ... end; function CreateComponent(ControlCls: TControl): TControl; begin result:=ControlCls.Create(Form1); ... end; 上面這兩個東東的結果不是一樣嗎?有會什麼差別??我只注重結果 |
來自:Pipi., 時間:2002-2-16 1:26:00, ID:923112 |
當然不同了 |
來自:beta, 時間:2002-2-16 2:34:00, ID:923171 |
to testnet: 將你的兩個函數名分別改爲 CreateComponent1 和 CreateComponent2 你象這樣編譯一下: CreateComponent1(TEdit); CreateComponent2(TEdit); 看出 結果 上的差別了吧? |
來自:beta, 時間:2002-2-16 2:35:00, ID:923172 |
前者要求傳入一個 類, 而後者要求傳入一個 對象(類的實例) |
來自:beta, 時間:2002-2-16 2:43:00, ID:923174 |
前一個函數將創建你傳入的類的一個實例,而後一個函數,沒有意義吧. |
來自:Jhdandcl, 時間:2002-2-16 10:53:00, ID:923281 |
上面都說得較清楚了, type MyClassRef=calss of CMyClass //表示MyClassRef爲指向CMyClass或其父類的指針. |
來自:leasun, 時間:2002-2-16 11:37:00, ID:923316 |
類的引用就像指向類的指針一樣 |
來自:testnet, 時間:2002-2-16 12:41:00, ID:923408 |
這個特性不錯 |
來自:xiangya, 時間:2002-2-21 1:33:00, ID:931109 | 編輯 |
沒有說清楚![:D]看看這裏的解釋: 準確的說,這是一種編譯器提供的原始二次識別的方法. "我定義很多的類,當然,他們是一個系統的,然後,我把它們統統成爲某某類, 當你需要某個類或者類的實例(通常是後者)的時候,你就告訴我那個類的名稱, 然後,我就給你那個類,或者類的實例"其實這也不清楚,在後面, "你是一個豬,豬類,他是一個馬,馬類,我是一個頭人,人類," 好了,"我們這些類都統統稱爲動物類"(實際生活中有動物類嗎[?]沒有! 都是抽象出來的概念)那麼,動物類的實例我們稱爲某個動物, 現在,屠宰場要買一個動物,好!到底是要一個豬呢,還是一個馬嗎[?]反正不會是一頭人啦. 這樣,我們送去一個豬類或者馬類(記住,這是類型),不管如何,屠宰場就會得到一個動物. 最後,某個人類的實例就有得吃了[:D] 好好想想,然後對照下面, Type TControlCls = Class of TControl; function CreateComponent(ControlCls: TControlCls): TControl; //這裏是在問"你是給我送個馬類還是豬類呢[?]" //結果呢,下面的代碼送了一個窗口類[:)] begin result:=ControlCls.Create(Form1); ... end; function CreateComponent(ControlCls: TControl): TControl; //在問,你要那一個豬[?] //答:我要窗口1的那個豬[^] begin result:=ControlCls.Create(Form1); ... end; 好了,這下沒有明白的話,那真是豬.[:)] 最後一種表達: 你需要什麼樣的類型,那好,你告訴我你要的類型,我給建一個這樣的對象出來。 [:(!][:(!]聲明,千萬不要誤會,我沒有罵人,我想這樣說,您的印象非常之深刻,更好理解. |