線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1004
推到 Plurk!
推到 Facebook!

請教一下class procedure 和procedure 有甚麼區別??

尚未結案
nicchen
一般會員


發表:2
回覆:0
積分:0
註冊:2004-07-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-20 10:18:07 IP:218.79.xxx.xxx 未訂閱
請教一下class procedure 和procedure 有甚麼區別?? 請知道的朋友告訴我一下!!謝謝了!!!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-20 11:10:17 IP:202.39.xxx.xxx 未訂閱
應該是指 class methods 與 object methods 的區別吧 參考底下這篇: http://dev.csdn.net/article/9/9508.shtm    探究:如何判斷 Delphi 中的物件指標是否可用 作者: Musicwind® 創建時間:2001-08-07     近日,在網上看到有網友問曰:如何確定一個物件指標是否可用? 也就是說,如何確定一個物件指標是否指向一個真正可用的物件實例? 其實這本不應該成爲一個問題。因爲對於程式設計者來說,他應該能夠 控制自己的程式不去訪問一個無效的指標,因爲所有的物件實例的創建 和銷毀都在他控制之下。並且即便沒有一個直接的辦法來判斷物件指標 是否可用,也可以通過其他間接的途徑(比如使用一些標識等)來做到 這一點(比如當我們銷毀一個物件實例後,我們將物件指標的指置爲 nil)。 但是假如我們抛開以上所說的這兩點不談,單單來研究在 Delphi 中,究竟 有沒有辦法來判斷一個物件指標是否可用,那情況會如何呢? 在 Object Pascal 中,一個類可以有兩種類型的方法,一種稱爲物件方法(Object Method),另一種是類方法(Class Method)。所謂物件方法, 指的是方法的定義是針對物件(或稱實例)的,因此調用該方法需要基於 某個物件(或稱實例),比如類的析構函數 Destroy 就是一個物件方法( 其實我們經常用到的絕大部分方法都是物件方法)。而類方法,指的是 方法的定義是基於一類物件而言,因此調用該方法不需要基於特定的物件 實例,比如類的構造函數 Create 就是如此。這一點,對我們有些啓發。 判斷一個物件指標是否可用,似乎可以通過以下步驟來完成。首先,我們 可以判斷該物件指標是否是 nil,如果是,那麽大功告成,確定不可用無疑; 如果否,那麽嘗試執行該物件的某個物件方法,看看是否出現諸如無效 記憶體訪問等的異常,由此來判斷該物件是否可用。用如下代碼來驗證 我們的想法:
var 
Obj: TObject;
begin
  Obj := TObject.Create;  //1.創建一個物件
  Obj.Free;             //2.釋放剛剛創建的物件,此時記憶體被回收
  If Obj = nil then        //3.判斷指標是否爲空,(這一步往往不成功,因爲物件
//被釋放,Delphi 也不會自動將物件指標置空)
    ShowMessage('物件指標不可用。')
  else
  begin
    Try
      If Obj.ClassType = TObject then  //4.調用 TObject 的一個物件方法
        ShowMessage('物件類型爲 TObject');
    Except
      ShowMessage('物件指標不可用。')
    End;
  end;
end;
執行上述代碼,我們發現,即使 Obj.Free 已經執行,Obj.ClassType 依然 可用。 這表明,並不是所有的物件方法一定要依賴於某個物件實例才能夠訪問。 究其原因,是因爲這個物件方法不需要訪問某個物件實例所申請的記憶體。 從這個意義上來說,TObject.ClassType 方法並不像是一個是真正的物件 方法,而頗有些類方法的味道。 執行上述代碼,我們還可以發現,一個物件執行 Free 方法,只是將其在創建 時所申請的記憶體釋放全部釋放,但是並不影響到物件指標本身的值。物件 指標還是指向原來的記憶體位址。同時,由於某些物件方法(如ClassType) 實現的特殊性,即使物件已經被釋放了,物件方法的調用結果仍然正確。 綜上所述,我們可以得出一個結論,那就是,一個物件指標是否能夠被判斷爲 是否可用,要看該物件指標所屬的類,是否提供了訪問物件實例記憶體的途徑 ——這個途徑可以是方法,也可以是屬性。那麽,現在具體到各個類中,情況 又如何呢? TObject,該類是所有類的祖先類,沒有辦法作出判斷。 TPersistent,由 TObject 派生而來,創建物件實例時不需要申請額外的 記憶體,所以也沒有辦法判斷。 TComponent,由 TPersistent 派生而來,增加了許多在創建物件實例時 需要申請額外記憶體的屬性,所以從理論上來說,它是可判斷的。 代碼如下:
function ComponentExists(AComponent: TComponent): Boolean;
begin
  try
    AComponent.HasParent; // 注意:這個句子也可以爲 AComponent.Tag;
                          // 或者爲 AComponent.Name
    result := True;
  except
    result := False;
  end;
end;
通過調用 ComponentExists,我們可以得知一個 TComponent 類型的物件指標 是否可用,而不管該物件指標是否已經被釋放,是否被置爲 nil。 其他類,如 TControl,TWinControl,或者 TButton 等等, 只要是由 TComponent 派生而來,則 TComponent 的判斷方法依然適用。 還有其他一些用戶自定義的類,若是直接由不能判斷的類(比如 TObject 和 TPersistent)派生而來,但是沒有需要在實例化時申請記憶體的屬性,那麽 也沒有辦法判斷;反之,則可以。據個例子來說: 假設我們有一個 TPerson 類,定義如下:
TPerson = Class(TObject)
Private
  FSex: TSex; // TSex 是枚舉類型的性別;
  FFirstName: String; 
  FLastName: String; 
  //…
Public
  property Sex: TSex read FSex write FSex;
  property FirstName: String read FFirstName write FFirstName;
  property LastName: String read FLastName write FLastName;
  //…
end;
那麽,對於 TPerson 類型的指標 Person,可以用如下代碼判斷指標是否可用:
  Try
    Person.Sex;
    //或者 Person.FirstName;
    //或者 Person.LastName;
    result := True; //指標可用
  Except
    result := False;//指標不可用
  end;
以上我們探討的只是一種技術上的可能性。想要強調的一點是,即使有一個 好的可行的辦法,也不鼓勵經常這麽做。因爲,一個邏輯嚴密的程式,本來 就應能夠杜絕去訪問一個無效的指標。 -- 向 KTop 的弟兄們致敬!
系統時間:2024-03-29 18:53:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!