為何物件沒建立,也可以使用它的方法? |
|
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
小弟做一個單元,內含一個class,class裡有兩個方法:
[code delphi] unit A; type TA = class(TObject) public procedure A; procedure B; end; var A: TA; implementation procedure TA.A; begin ... end; procedure TA.B; begin ... end; [/code] 然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。 有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我不做原理的說明, 只做實作的說明
unit 是一支pas, pas之間互相引用, b uses a, 其實編譯時 b已經把 a 包進來了, 所以沒有建立的問題, 就好像 你直接開一支 form1.pas, 看看檔頭 uses 的那些, form, widows, graphics, .. 那一支你有create過, 還不是照樣編釋通過, 還可以運作! 這只是很單純兩支 pas 引用問題, 在 a.pas中, 如果有呼叫到一些物件而沒有進行 create, 那 b 去引用 a, 一樣會發生錯誤 (Access Error xxxxx) ===================引 用 stacker_liew 文 章=================== 小弟做一個單元,內含一個class,class裡有兩個方法: [code delphi] unit A; type TA = class(TObject) public procedure A; procedure B; end; var A: TA; implementation procedure TA.A; begin ... end; procedure TA.B; begin ... end; [/code] 然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。 有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。 |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
顆顆 ~~請容我做出一些說明 原本 就是有分Class Method 和 Object Method 舉個簡單的例子 TA = class( class procedure A; class procedure A1; //Object Method end; { TA } class procedure TA.A; begin Showmessage(Self.Name); //正確 end; procedure TA.B; begin Showmessage(Self.Name); 所以不是編譯都會過 如果你不想建實體 (instance)
嚴謹一點應該要用Class Method 全部都定義成 Object Methods ,是比較從簡的做法 ===================引 用 P.D. 文 章=================== 我不做原理的說明, 只做實作的說明 unit 是一支pas, pas之間互相引用, b uses a, 其實編譯時 b已經把 a 包進來了, 所以沒有建立的問題, 就好像 你直接開一支 form1.pas, 看看檔頭 uses 的那些, form, widows, graphics, .. 那一支你有create過, 還不是照樣編釋通過, 還可以運作! 這只是很單純兩支 pas 引用問題, 在 a.pas中, 如果有呼叫到一些物件而沒有進行 create, 那 b 去引用 a, 一樣會發生錯誤 (Access Error xxxxx) ===================引 用 stacker_liew 文 章=================== 小弟做一個單元,內含一個class,class裡有兩個方法: [code delphi] unit A; type TA = class(TObject) public procedure A; procedure B; end; var A: TA; implementation procedure TA.A; begin ... end; procedure TA.B; begin ... end; [/code] 然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。 有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。 |
carstyc
資深會員 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
講簡單一點的話就是...
如果Procedure 裡面完全沒有參考使用到 class 裡面的變數,基本上編譯不會出錯。 如果有用到變數,那就class就必需要有 Instance 才可以..... 在沒有建立Instance 的狀況下使用procedure的話...編譯就會報錯.... ===================引 用 stacker_liew 文 章=================== 小弟做一個單元,內含一個class,class裡有兩個方法: [code delphi] unit A; type TA = class(TObject) public procedure A; procedure B; end; var A: TA; implementation procedure TA.A; begin ... end; procedure TA.B; begin ... end; [/code] 然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。 有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
remove
var A: TA; and you should get compilation error....:P When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
都不會出錯
Class Procedure 才是你說的這樣 ===================引 用 carstyc 文 章=================== 講簡單一點的話就是... 如果Procedure 裡面完全沒有參考使用到 class 裡面的變數,基本上編譯不會出錯。 如果有用到變數,那就class就必需要有 Instance 才可以..... 在沒有建立Instance 的狀況下使用procedure的話...編譯就會報錯.... ===================引 用 stacker_liew 文 章=================== 小弟做一個單元,內含一個class,class裡有兩個方法: [code delphi] unit A; type TA = class(TObject) public procedure A; procedure B; end; var A: TA; implementation procedure TA.A; begin ... end; procedure TA.B; begin ... end; [/code] 然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。 有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。 |
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
那是不是var A: TA;就具有instance的作用了嗎?然後我們都可以不必再去處理建立/解除instance的工作?
===================引 用 Coffee 文 章=================== remove var A: TA; and you should get compilation error....:P When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error. |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
前幾篇都沒在看 XD~
如果不參考Class中的變數 就是如同你講的 不必再去處理建立/解除instance ===================引 用 stacker_liew 文 章=================== 那是不是var A: TA;就具有instance的作用了嗎?然後我們都可以不必再去處理建立/解除instance的工作? ===================引 用 Coffee 文 章=================== remove var A: TA; and you should get compilation error....:P When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error. |
stacker_liew
中階會員 發表:59 回覆:168 積分:65 註冊:2004-05-17 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
我都傻傻的用,不知原因....現在有點清楚了, PD 與 leveon 的簡單講解,很實用!!. 贊 謝謝您 ===================引 用 leveon 文 章=================== 前幾篇都沒在看 XD~ 如果不參考Class中的變數 就是如同你講的 不必再去處理建立/解除instance
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩. |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
If you dunno what delphi define it, STFM is your good friend.
And, there's a hint for how delphi use a unit scope variable, please take a look on how delphi control the "Auto-create Form" and check the source code, it's a nice trick. ===================引 用 stacker_liew 文 章=================== 那是不是在沒用到Class Method的情況下,最保險的方法,就是自己處理建構/解除Instance的工作? 例如在別的單元使用A時: [code delphi] implementation use A; procedure BOnClick(Sender: TObject); begin A := TA.Create; try with A do begin A; B; end; finally A.Free; end; end; [/code]
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |