請教關於static member |
|
peipei36
一般會員 ![]() ![]() 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
|
lee
站長 ![]() ![]() 發表:55 回覆:173 積分:45 註冊:2002-02-27 發送簡訊給我 |
引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!我想應該是沒有的,因為Class用來定義物件,它只是一個記憶體的指標(Addressing Pointer),必需經由Create方法來配製一塊記憶體,它與變數是不同的,若不須採用物件的繼承..等屬性就用record來定義static變數吧! ![]()
------
~~~Delphi K.Top網站總管~~~ |
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!直接使用Class Function 傳回值應該就可達到你要的目的 例如TObject.className 我常用一Class Function 傳回對此Class之描述, 如此不須Create即可了解此一Class Base Class可宣告為Virtual以便override |
cubi
初階會員 ![]() ![]() 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
引言:請教前輩: Class Funtion 到底是什麼呢??小弟愚昧一直搞不清楚,可否請前輩 指導,謝謝引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!直接使用Class Function 傳回值應該就可達到你要的目的 例如TObject.className 我常用一Class Function 傳回對此Class之描述, 如此不須Create即可了解此一Class Base Class可宣告為Virtual以便override |
peipei36
一般會員 ![]() ![]() 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
ccchen sir~
感謝您的說明,但是這樣的做法資料該記錄在哪呢?!
我指的類似原來的class內欄位的部份?!
不知能否請您舉個簡單的code例子...好想學這招...thx~ 另外,cubi sir~
class function 有點類似我們平常在用的公用函數,
可以不必建物件直接呼叫使用,寫法與class一般的成員函數相同,
只是在宣告、定義前都加上'class'(即class function fun1..)..
例如:呼叫 ClassA.fun1,而不必 obja := ClassA.Create;後再使用obja.fun1..
大概是這樣子...
|
天外來客
初階會員 ![]() ![]() 發表:22 回覆:199 積分:44 註冊:2001-11-27 發送簡訊給我 |
引言: ccchen sir~ 感謝您的說明,但是這樣的做法資料該記錄在哪呢?! 我指的類似原來的class內欄位的部份?! 不知能否請您舉個簡單的code例子...好想學這招...thx~ 另外,cubi sir~ class function 有點類似我們平常在用的公用函數, 可以不必建物件直接呼叫使用,寫法與class一般的成員函數相同, 只是在宣告、定義前都加上'class'(即class function fun1..).. 例如:呼叫 ClassA.fun1,而不必 obja := ClassA.Create;後再使用obja.fun1.. 大概是這樣子... 以下是我製作Tutorial時之程式片斷, 提供參考 1. rbBase.pas (宣告Base Class及Class function) type TfmrbBase = class(TForm) ... public class function GetDescpt:string; virtual; abstract; end; 2. unit T01.pas(第一個Child) type Tfm01 = class(TfmrbBase) .. public class function GetDescpt:string; override; { Public declarations } end; implementation {$R *.dfm} class function Tfm01.GetDescpt: string; begin Result:='直接使用ppDataPipeline連接DataSource 之簡單Report'; end; 3. unit T02.pas(第二個Child) type Tfm01 = class(TfmrbBase) .. public class function GetDescpt:string; override; { Public declarations } end; implementation {$R *.dfm} class function Tfm02.GetDescpt: string; begin Result:='使用ppReport之內部Pipeline連接資料庫'; end; 4. main.pas--FormCreate時先建立List, User選擇時, Show所選CLass之Descpt ... uses rbBase,t01,t02; {$R *.dfm} procedure TfmMain.FormCreate(Sender: TObject); begin ListBox1.items.AddObject('01 Simple Report',TObject(Tfm01)); ListBox1.items.AddObject('02 使用內部PipeLine',TObject(Tfm02)); end; procedure TfmMain.ListBox1Click(Sender: TObject); var id:integer; fmclass:TrbClass; begin id:=ListBox1.itemindex; if id >=0 then begin fmclass := TrbClass(Listbox1.Items.Objects[id]); Memo1.lines.clear; memo1.lines.add(fmclass.GetDescpt); //呼叫Class Function取得字串 end; end;優良文章 |
peipei36
一般會員 ![]() ![]() 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
感謝您回應,但是我仍有些不解...可否請大家幫忙..
您的code感覺是單純class function的運用..
但是一般其他語言所謂的static member欄位的部份,
比較像我們非OO的全域變數,也就是說,
如果用class function處理時,希望它在class function結束後,
能將運算的結果,存放在某一個「非區域的變數」,
但這個非區域的變數,覺得若去定義、使用全域變數,破壞class架構..
例如,我在系統進入時,取得了目前系統的曆制,這個變數若不使用全域變數,
又不想建立物件,就比較像一般其他語言的static特性...
不知這樣的表達方式,會不會很清楚?!先感謝大家的幫忙!!
===像這樣的「感覺」====
class1=class public class Var1:string; end; //使用時 採用類似 class1.Var1 := 'xxx'; ShowMessage(class1.Var1); |
天外來客
初階會員 ![]() ![]() 發表:22 回覆:199 積分:44 註冊:2001-11-27 發送簡訊給我 |
|
peipei36
一般會員 ![]() ![]() 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |