關於物件屬性的呼叫 |
尚未結案
|
nick6562
一般會員 發表:26 回覆:19 積分:9 註冊:2004-07-15 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
nick6562
一般會員 發表:26 回覆:19 積分:9 註冊:2004-07-15 發送簡訊給我 |
|
nick6562
一般會員 發表:26 回覆:19 積分:9 註冊:2004-07-15 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
不好意思,小弟插個花,一點淺見,還請先進們指正: 物件就包含在Class中,先來看看Class吧:Class是一個包含Field,Method,Property(Event)三種成員的構造體.而物件既是Class的實例,是使用constructors(通常用Create)來生成的一個記憶體塊。當銷毀一個物件使用destructors(通常用Destory). 再來看看Method吧,從幾個觀點來看
1從調用者的角度
①普通方法
②類方法(Class Method)
不同點:普通方法只能被類實例(既物件)調用,而類方法不但可以被物件調用,還可以直接被類調用。eg:
...... TOneObject = class class procedure ClassProc; //聲明一個類方法ClassProc。方法是在最前面加上關鍵字Class procedure OneProc; //聲明一個普通方法OneProc end; ...... implementation {$R *.dfm} ...... class procedure TOneObject.ClassProc; begin ShowMessage('ClassProc類方法'); end; procedure TOneObject.OneProc; begin ShowMessage('OneProce普通方法'); end; procedure TForm1.Button1Click(Sender: TObject); var OneObj: TOneObject; begin TOneObject.ClassProc; //類方法可以直接被類調用 OneObj := TOneObject.Create; //Create本身也是個類方法 OneObj.ClassProc; //物件也能調用類方法 OneObj.OneProc; //普通物件只能被物件調用 OneObj.Free; end;2從調用機制上來看: ①靜態方法 ②虛方法 ③純虛方法 不同點時:靜態方法沒有任何的修飾詞,而虛方法需要用關鍵字virtual或dynamic來實做(需要在子類中對虛方法進行覆蓋時,使用關鍵字override),eg: ...... TParent = class //父類 procedure OneProc; virtual; function OneFun: Boolean; dynamic; end; TChild = class(TParent) //子類 procedure OneProc; override; function OneFun: Boolean; override; end; ...... implementation {$R *.dfm} ...... procedure TParent.OneProc; //父類 begin ShowMessage('TParent的OneProc'); end; function TParent.OneFun: Boolean; begin Result := False; end; procedure TChild.OneProc; //子類,注意這裏開始用虛方法進行覆蓋 begin inherited; //調用父類的OneProc代碼,這句顯示的結果是'TParent的OneProc' ShowMessage('TChild的OneProc'); end; function TChild.OneFun: Boolean; begin Result := inherited OneFun; //調用父類的OneFun代碼 if not Result then Result := True; end; procedure TForm1.Button1Click(Sender: TObject); var Child: TChild; begin Child := TChild.Create; Child.OneProc; if Child.OneFun then ShowMessage('OneFun return true返回真哦'); Child.Free; end;而純虛方法是虛方法的一種特例,主要特定就是在虛方法後面加上關鍵字abstract,需要注意的是:純虛方法只有聲明部分,沒有實現部分,而虛方法必須有實現部分,那怕只有begin...end而裏面沒有code都行。純虛方法只有在子類覆蓋並實現後才能被調用。 如果一個Class中含有純虛方法(abstract members),那麽這個Class就是abstract class 用來分析純虛方法的最好例子就是TStrings,我們打開TStrings的code,不難發現裏面有許多純虛方法: procedure Clear; virtual; abstract; procedure Delete(Index: Integer); virtual; abstract; 而純虛類是不應該直接用來創建實例的,因爲一旦使用了純虛方法,將抛出異常,而我們很難保證不在某些地方調用純虛方法。所以儘管實例化純虛方法是可以的,但是我們還是要避免。純虛類一般是中間類,實際使用的總是覆蓋實現了純虛方法的字類。這也就是爲什麽我們都是使用TStrings的子類而不使用它本身。 而關於屬性的討論,請參考一下該篇中小弟的相關討論: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55494 鴨子太囂張,兔子太多嘴,我是bigdog,我很乖 參考文獻 “>人生在勤,不索何獲> <>業精於勤荒於嬉,行成於思毀於隨> <>臨淵羡魚不如退而結網> 發表人 -
------
人生在勤,不索何获? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |