關於Method 的override謎思? |
答題得分者是:Justmade
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
一直以來對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 發送簡訊給我 |
【問題:】
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 發送簡訊給我 |
試試這個 :
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 中可見:
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |