constructor的使用方法 |
答題得分者是:danny
|
daniel710624
一般會員 發表:11 回覆:13 積分:4 註冊:2003-04-11 發送簡訊給我 |
各位好! 我有一段程式,一直出現Warning, 不知該如何解? 可否請各位指點一下觀念上出了什麼錯誤?
我使用BDS 2006: type TFormQrySY132 = class(TForm) .................... private { Private declarations } FMySQL: String; public { Public declarations } constructor Create(AOwner: TComponent); overload; override; constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual; property MySQL : String read FMySQL; ....................... ....................... constructor TFormQrySY132.Create(AOwner: TComponent); begin inherited Create(AOwner); end; constructor TFormQrySY132.Create(AOwner: TComponent; sMySQL: String); begin FMySQL := sMySQL; inherited Create(AOwner); end; .................... 當建立 FormQrySY132 的時候, 我可以有兩種Create方式: FormQrySY132 := TFormQrySY132.Create(Self); 或 FormQrySY132 := TFormQrySY132.Create(Self, 'SELECT * FROM MYTABLE'); 我的問題: <basefont></basefont> 1.程式在編譯的時候會在這一行 constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual; 出現Warning錯誤: Method 'Create' hides virtual method of base type 'TCustform' 是否我宣告錯誤?如何才是正確的使用方法? 2.下面這段程式有必要嗎? constructor TFormQrySY132.Create(AOwner: TComponent); begin inherited Create(AOwner); end; 它直接進行inherited Create(AOwner), 沒做其它事! 是否有必要在程式中寫上這麼一段? 感謝各位指導! 編輯記錄
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
不知道你有沒有查inherited是作什麼用的,
warning最主要告訴你,你宣告的這個函式已經有一個隱含的上層同名函式 inherited就form而言是必要的,因為你繼承的form,並不會直接繼承上一層constructor的內容, 這樣導致上一層在constructor處理的事你沒有繼承到,使用inherited就是指定使用上一層的函式 相對的,在constructor有inherited,在desctructor裡面也要inherited 通常我們會在construct時去初始化並處理記憶體,在destruct時去釋放記憶體, 所以在construct的慣例通常是先inherited上一層再處理自己這一層的事, 在destruct的慣例則是先把自己的釋放掉再inherited上一層 所以並不是沒作其它事,但是我想這個好像是基本(?)
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 16:50:19, 註解 無‧
|
daniel710624
一般會員 發表:11 回覆:13 積分:4 註冊:2003-04-11 發送簡訊給我 |
感謝您的協助!
我了解inherited的意函, 也知道出現Warning的原因! 但如果我須要兩種Create函式, 做到下面的需求, 該如何修改我的程式? FormQrySY132 := TFormQrySY132.Create(Self); 或 FormQrySY132 := TFormQrySY132.Create(Self, 'SELECT * FROM MYTABLE'); 望您再指點一下! 謝謝! 另外! 在constructor , 依我的習慣,除非是TForm本身的Properties/Methods或者是 其他元件的Properties/Methods , 否則, 我都會寫在inherited Create前面! |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
我不太懂你的需求需要怎樣的協助,如果你只是為了那個warning,那就將inherited加上去就可以
我比較偷懶,如果self的那個跟多sql的那個作的事只差在sql相關的init, 那就將inherited寫在self,sql的去引用它,如果compiler持續的complain,那就將inherited獨立在兩個函式中 至於為什麼是慣例,我想你可以參考跟物件有關的書籍,如Delphi programming & problem soving 建構先繼承是因為要先初始化上層,再初始化自己,因為你在初始化自己的過程中可能就會用到上層的資源,若是上層未初始化,就容易產生無預警錯誤,反之亦然。 當然,你有你的理由需要先初始自己,或者夾在中間都可以,這是Delphi授予的自由。 Sorry,我誤會了,你想要的是這個keyword:reintroduce,查一下help就有了
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 18:56:11, 註解 無‧
|
daniel710624
一般會員 發表:11 回覆:13 積分:4 註冊:2003-04-11 發送簡訊給我 |
需要怎樣的協助?
這麼問吧! 我的程式在Public處做了以下宣告: constructor Create(AOwner: TComponent); overload; override; constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual; 這樣是對還是錯? 如果是錯, 那該怎麼改? 我加上reintroduce constructor Create(AOwner: TComponent); reintroduce; overload; override; constructor Create(AOwner: TComponent; sMySQL: String); reintroduce; overload; virtual; 確實不會再出現Warning! 但是否這就正解? 在網路上找到類似的範例如下, 都沒有使用reintroduce, 只不過, 那是Delphi 4的範例, 不知是不是之後的版本才需要加? ........... public { Public declarations } constructor Create(AOwner: TComponent); overload; override; constructor Create(AOwner: TComponent; MyCaption: string); overload; virtual; published { Published declarations } end; implementation constructor TMyButton.Create(AOwner: TComponent); begin inherited Create(AOwner); Width := 185; Height := 105; end; constructor TMyButton.Create(AOwner: TComponent; MyCaption: string); begin inherited Create(AOwner); Width := 185; Height := 105; Caption := MyCaption; end; |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
我想如果你都能自己找code來看,那不妨考慮一下去trace VCL中那些有多個constructor的component,看他們怎麼寫最快
再或者,我認為你應該也了解那幾個identifer的意義,那麼自己實測一遍是不是你要的效果也OK。 嘗試去建一個從TObject繼承下來的class,然後再以這個為base去建你需要測試的class 將你認為可能有問題的部份從頭到尾徹底的測一遍就是了
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 22:05:15, 註解 無‧
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual; 就可以了。 甚至 Create(AOwner: TComponent) 沒用到就不需在申告。減少 OverLoad 但必須在 Create 中,inherited Create(AOwner); 至於 Warning 不需理會。 這題目應是 VCL 區,至少讓我表現一下下。 o o |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
|
daniel710624
一般會員 發表:11 回覆:13 積分:4 註冊:2003-04-11 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |