理解類引用這種型別 (轉)

worldblog發表於2007-12-12
理解類引用這種型別 (轉)[@more@]

問題:


書中寫到: -------------------- 類的引用是一種型別,它不是對的引用,也不是對類的引用,而是對類的型別的引用。類的引用型別定義了引用變數的型別。假設定義了一個類: type CMyClass=class ... end 下面定義一個新類的引用型別,與下面的類相關: type MyClassRef=calss of CMyClass 這樣就宣告瞭兩個型別的變數: aClassRef:MyClassRef; a:CMyClass; 其中第一個變數引用一個物件,第二個引用類: aClassRef=CMyClass; aObject=CMyClass.Create; -------------------- 這一段我看不明白,請各位解釋一下。謝謝

來自:bbs.com/delphibbs/dispu.?username=Pipi." target=_blank>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 我們定義一個基類,然後透過傳遞不同的子類,那麼一個函式只寫一次就實現不同的效果

來自:, 時間: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物件

來自:, 時間:2002-2-9 0:07:00, ID:916478 

謝謝,我書上的例子怎樣理解呢?

來自:, 時間:2002-2-9 0:29:00, ID:916503 

你書上的例子就更簡單了,根本沒講到實際的用途 就是出現aClassRef的地方你把它看成CMyClass好了

來自:" target=_blank>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; 上面這兩個東東的結果不是一樣嗎?有會什麼差別??我只注重結果

來自:, 時間:2002-2-16 1:26:00, ID:923112 

當然不同了

來自:, 時間:2002-2-16 2:34:00, ID:923171 

to testnet: 將你的兩個函式名分別改為 CreateComponent1 和 CreateComponent2 你象這樣編譯一下: CreateComponent1(TEdit); CreateComponent2(TEdit); 看出 結果 上的差別了吧?

來自:, 時間:2002-2-16 2:35:00, ID:923172 

前者要求傳入一個 類, 而後者要求傳入一個 物件(類的例項)

來自:, 時間:2002-2-16 2:43:00, ID:923174 

前一個函式將建立你傳入的類的一個例項,而後一個函式,沒有意義吧.

來自:, 時間:2002-2-16 10:53:00, ID:923281 

上面都說得較清楚了, type MyClassRef=calss of CMyClass //表示MyClassRef為指向CMyClass或其父類的指標.

來自:, 時間:2002-2-16 11:37:00, ID:923316 

類的引用就像指向類的指標一樣

來自:, 時間:2002-2-16 12:41:00, ID:923408 

這個特性不錯

來自:, 時間: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; 好了,這下沒有明白的話,那真是豬.[:)]


最後一種表達:


你需要什麼樣的型別,那好,你告訴我你要的型別,我給建一個這樣的物件出來。


[:(!][:(!]宣告,千萬不要誤會,我沒有罵人,我想這樣說,您的印象非常之深刻,更好理解.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992150/,如需轉載,請註明出處,否則將追究法律責任。

相關文章