全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3438
推到 Plurk!
推到 Facebook!

關於Method 的override謎思?

答題得分者是:Justmade
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-15 11:29:28 IP:61.219.xxx.xxx 未訂閱
一直以來對Delphi override一直搞不懂。 於是今天看完Help後,大概知道 override是用來"改寫"繼承的父親中用virtual or dynamic所選告的method, (是吧,翻好久,不知道是不是這樣解釋?) 於是就來測式啦 我大概測試的方法是用form1宣告一個virtual method和一個static method, 在用form2繼承,然後針對form1的method來進行改寫(override) ----------------------------------------------------------- Form1的程式: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public procedure showmsg; procedure showmsg2; virtual; //********用virtual { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.showmsg(); begin showmessage('Form1 msg1'); end; procedure TForm1.showmsg2(); begin showmessage('Form1 msg2'); end; end. ----------------------------------------------------------- Form2 的程式: unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit1, StdCtrls; type TForm2 = class(TForm1) Button1: TButton; procedure Button1Click(Sender: TObject); procedure showmsg2(); override; //********用override procedure showmsg(); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.DFM} procedure TForm2.Button1Click(Sender: TObject); begin inherited; showmsg(); showmsg2(); end; procedure TForm2.showmsg; begin showmessage('Form2 msg1'); end; procedure TForm2.showmsg2; begin inherited; showmessage('Form2 msg2'); end; end. ----------------------------------------------------------- 然後我一開始用form2為 Main Form 則會顯示 Form2 msg1 Form1 msg2 Form2 msg2 的結果~~~~ 可是如果我在form2的 showmsg 的函式中加入inherited; 那結果就變成 Form1 msg1 Form2 msg1 Form1 msg2 Form2 msg2 我了解是因為祖先元件只要不把函式放在private中, 可以讓後代元件繼函該函式(函式名稱要相同且要有inherited) 但是這樣一來,不就代表,就算我宣告的是static method, 只要我繼承的函式有加上inherited; 我的後代也可以修改祖先的static method, 那override的存在不就是多此一舉。 EX: type TForm2 = class(TForm1) //......如果有加override,會自動加上inherited; procedure showmsg2(); override; //沒有加override,則不會加上inherited,取代祖先同名的函式 procedure showmsg2(); 但是我自己到沒用override函式中加入inherited;, 一樣有繼承到原函式的功能,加入自己要的程式,也達到修改的功能。 講一堆可能大家還是不知道我在問什麼, 以下是主要要表達的, 【問題:】 override是改寫一個方法,那是完全改寫,還是繼承後改寫? 1.完全改寫:就是和祖先元件用相同的函式名,但是內容的程式完全不同。 那自己宣告一個全新的函式就好了,幹麻要用override。 2.繼承後改寫:也就是保留父元件原方法的程式,可以在加上自己其他的 程式。那就出現我上面說的。我在繼函祖先元件後, 宣告一個和祖先元件static method名稱一樣的 method,自己加入inherited;後,一樣達到繼承,一樣 達到可以修改,static函式不是比較快嗎,那為什麼要 用virtual和dynamic來宣告函式,還要用override來做 到修改的動做? 嗯~~~我還是不懂@_@||| ---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-15 12:10:19 IP:210.3.xxx.xxx 未訂閱
【問題:】 override是改寫一個方法,那是完全改寫,還是繼承後改寫? 1.完全改寫:就是和祖先元件用相同的函式名,但是內容的程式完全不同。 那自己宣告一個全新的函式就好了,幹麻要用override。    Overrided method can be used in the parent while static method can't. 2.繼承後改寫:也就是保留父元件原方法的程式,可以在加上自己其他的 程式。那就出現我上面說的。我在繼函祖先元件後, 宣告一個和祖先元件static method名稱一樣的 method,自己加入inherited;後,一樣達到繼承,一樣 達到可以修改,static函式不是比較快嗎,那為什麼要 用virtual和dynamic來宣告函式,還要用override來做 到修改的動做? I think a little example may help : < class="code"> TParent = class protected function IntTest: integer; virtual; public function Test: integer end; function TParent.IntTest: integer; begin Result := 0; end; function TParent.Test: integer; begin Result := IntTest; end; {....} TChild = class(TParent) protected function IntTest: integer; override; end; function TChild.IntTest: integer; begin Result := 1; end; {....} AChild := TChild.Create; ShowMessage(IntToStr(AChild.Test)); // should display '1'
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-15 13:32:29 IP:218.16.xxx.xxx 未訂閱
試試這個 :
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  THuman = Class
    function Name : String;
    function Sex : String; Virtual;
  end;
  TJohn = Class(THuman)
    function Name : String;
    function Sex : String; Override;
  end;
  TMary = Class(THuman)
    function Name : String;
    function Sex : String; Override;
  end;      TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    { THuman }    { THuman }    function THuman.Name: String;
begin
  result := 'N/A';
end;    function THuman.Sex: String;
begin
  result := 'N/A';
end;    { TJohn }    function TJohn.Name: String;
begin
  result := 'John';
end;    function TJohn.Sex: String;
begin
  result := 'Male';
end;    { TMary }    function TMary.Name: String;
begin
  result := 'Mary';
end;    function TMary.Sex: String;
begin
  result := 'Female';
end;    procedure TForm1.Button1Click(Sender: TObject);
var
Msg : String;
Tester : THuman;
begin
  Msg := 'Test Static and Virture Methods'#13#10;
  Tester := TJohn.Create;
  Msg := Msg   'Tester 1 : TJohn :'#13#10;
  Msg := Msg   'My Name is '   Tester.Name   #13#10; // 'N/A' (THuman.Name)
  Msg := Msg   'My Sex is '   Tester.Sex   #13#10; // 'Male' (TJohn.Sex)
  Tester.Destroy;
  Tester := TMary.Create;
  Msg := Msg   'Tester 2 : TMary :'#13#10;
  Msg := Msg   'My Name is '   TMary(Tester).Name   #13#10; // 'Mary' (TMary.Name)
  Msg := Msg   'My Sex is '   Tester.Sex   #13#10; // 'Female' (TMary.Sex)
  Tester.Destroy;
ShowMessage(Msg);
end;    end.
這個例子 Name 是 Static method, Sex 是 virture method. 而 Tester 變數是 THuman (父代宣告) 從 Button1Click 中可見:
  1. 用 virture Method, 即使 Tester 宣告成 THuman, 呼叫 method 時是會自動使用 create 時的實在物件的 method 的 (TJohn.Sex, TMary.Sex)
  2. 用 static Method, 則會預設呼叫宣告物件的 method (THuman.Name static 嘛),除非你指明是要 TMary(Tester).name
所以,virture method 是物件導向中 多變 (polymorphism) 是很重要的一環。
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-15 15:02:30 IP:61.219.xxx.xxx 未訂閱
大概知道一些了, 看來我必需去加強一下OOP了~~~ @_@||| (程式的世界真是廣大~~~) ---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
系統時間:2024-05-13 7:16:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!