日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Delphi中静态方法重载还是覆盖的讨论

發(fā)布時(shí)間:2025/4/9 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi中静态方法重载还是覆盖的讨论 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Delphi中靜態(tài)方法重載還是覆蓋的討論

新人學(xué)習(xí)Delphi的時(shí)候,容易搞不懂的一個(gè)問(wèn)題,當(dāng)子類(lèi)方法和基類(lèi)方法同名,并且參數(shù)也一樣的時(shí)候,叫做什么呢?是覆蓋,還是重載呢?

?

答案是隱藏父類(lèi)方法。

?

一般我們的理解重載是同名,不同參數(shù)的同一個(gè)類(lèi)里面實(shí)現(xiàn),

或者父類(lèi)和子類(lèi)方法同名,參數(shù)不同,子類(lèi)必須有overide關(guān)鍵字,表示重載方法。

?

也就是說(shuō)重載必須有overload修飾;

?

覆蓋呢?覆蓋必須有override修改;

?

否則同名,同參數(shù)就是隱藏方法。

=================================================================

下面是筆者自己的程序,您可以嘗試一下。

?

program?Project2;

?

{$APPTYPE?CONSOLE}

?

uses

??SysUtils;

?

??type?tclassa=class

?????private

???????age?:Integer;

?????public

???????function?getage:integer;???//靜態(tài)方法

???????function?getDat:integer;??//靜態(tài)方法

???????end;

?

???????tclassb=class(tclassa)

???????private

?

?????????public

???????????function?getdat:integer;??//隱藏靜態(tài)方法

???????????function?getage:Integer;?//隱藏靜態(tài)方法

???????????end;

?

{?tclassa?}

?

function?tclassa.getage:?integer;

begin

??age?:=?1;

??result?:=?age;

end;

?

function?tclassa.getDat:?integer;

begin

??result?:=?3;

end;

?

{?tclassb?}

?

function?tclassb.getage:?Integer;

begin

??Result?:=?1+?inherited?getage();

end;

?

var?a:tclassa;

???b:tclassb;

function?tclassb.getdat:?integer;

begin

??result?:=?1?+?inherited?getdat();

end;

?

begin

??a?:=?tclassa.Create;

??b?:=?tclassb.Create;

?

??Writeln(a.getage());

??Writeln(b.getage());

??Writeln(a.getdat());

??Writeln(b.getdat());?//?調(diào)用的是子類(lèi)的隱藏后的靜態(tài)方法?

?

??readln;

?

??readln;

??a.free;

??b.free;

?

??{?TODO?-oUser?-cConsole?Main?:?Insert?code?here?}

end.

?

我們可以看到隱藏了父類(lèi)方法之后,還是可以調(diào)用父類(lèi)同名方法的。這就和覆蓋是相似的。

?

?

參考資料

=================================

?

Delphi面向?qū)ο蠓椒ǖ姆诸?lèi)以及覆蓋隱藏和重載

<6>?方法的分類(lèi)
??按用途分?普通方法,構(gòu)造方法,析構(gòu)方法,?類(lèi)方法,消息處理方法
??按運(yùn)行綁定機(jī)制分:靜態(tài)方法,虛方法,動(dòng)態(tài)方法,[注意此處的靜態(tài)方法不是所謂的class?method?而是普通的方法?,靜態(tài)是指靜態(tài)編譯]
??關(guān)于析構(gòu)方法,最好是用名字destroy?,這樣可以使用Free方法,而不要直接調(diào)用destroy方法.
??Free方法會(huì)先判斷對(duì)象變量是否為nil.
??procedure?TObject.Free;
??begin
????if?Self?<>?nil?then
??????Destroy;
??end;
??
??消息處理方法的例子:
??procedure?WMChar(var?message:TWMChar);message?WM_CHAR;
??問(wèn)題來(lái)了.為什么在一個(gè)Control中聲明了消息處理方法,就能調(diào)用此消息處理方法呢,這里涉及到
??TObject?中Dispatch方法的秘密,我暫時(shí)沒(méi)有看懂.留作以后繼續(xù)學(xué)習(xí)
??先給出Dispatch的源碼.
??procedure?TObject.Dispatch(var?Message);
??asm
??????PUSH????ESI
??????MOV?????SI,[EDX]
??????OR??????SI,SI
??????JE??????@@default
??????CMP?????SI,0C000H
??????JAE?????@@default
??????PUSH????EAX
??????MOV?????EAX,[EAX]
??????CALL????GetDynaMethod
??????POP?????EAX
??????JE??????@@default
??????MOV?????ECX,ESI
??????POP?????ESI
??????JMP?????ECX
??
??@@default:
??????POP?????ESI
??????MOV?????ECX,[EAX]
??????JMP?????DWORD?PTR?[ECX]?+?VMTOFFSET?TObject.DefaultHandler
??end;
??
??GetDynaMethod的方法源碼如下
??procedure???????GetDynaMethod;
??asm
??????????{?->????EAX?????vmt?of?class????????????}
??????????{???????SI??????dynamic?method?index????}
??????????{?<-????ESI?pointer?to?routine??}
??????????{???????ZF?=?0?if?found?????????}
??????????{???????trashes:?EAX,?ECX???????????????}
??
??????????PUSH????EDI
??????????XCHG????EAX,ESI
??????????JMP?????@@haveVMT
??@@outerLoop:
??????????MOV?????ESI,[ESI]
??@@haveVMT:
??????????MOV?????EDI,[ESI].vmtDynamicTable
??????????TEST????EDI,EDI
??????????JE??????@@parent
??????????MOVZX???ECX,word?ptr?[EDI]
??????????PUSH????ECX
??????????ADD?????EDI,2
??????????REPNE???SCASW
??????????JE??????@@found
??????????POP?????ECX
??@@parent:
??????????MOV?????ESI,[ESI].vmtParent
??????????TEST????ESI,ESI
??????????JNE?????@@outerLoop
??????????JMP?????@@exit
??
??@@found:
??????????POP?????EAX
??????????ADD?????EAX,EAX
??????????SUB?????EAX,ECX?????????{?this?will?always?clear?the?Z-flag?!?}
??????????MOV?????ESI,[EDI+EAX*2-4]
??
??@@exit:
??????????POP?????EDI
??end;
??
<7>?方法的覆蓋,隱藏和重載??
??覆蓋是override?,重載是overload;
??隱藏是子類(lèi)中的方法和父類(lèi)的方法同名,而且參數(shù)相同,沒(méi)有override修飾符,則子類(lèi)的方法就隱藏父類(lèi)的方法.
??Example:
???...
????TChineseMan?=?class(TMan)
??????procedure?SayHello(words:string);?//打招呼
????end;?
????....
???procedure?TChineseMan.SayHello(words:?string);
???begin
?????ShowMessage('TChinese?Man?SayHello?'+words);
???end;
???...
????procedure?TForm1.Button1Click(Sender:?TObject);
????var
?????APerson:TMan;
?????AChinesePerson:TChinesePerson;
????begin
?????APerson:=TChineseMan.Create;
?????APerson.SayHello('是一名中國(guó)人');?
?????//注意了此處調(diào)用的是父類(lèi)的TMan.Sayhello方法
?????//
?????ChinesePerson:=TChinesePerson.Create;
?????ChinesePerson.SayHello('是一名中國(guó)人');?//此時(shí)調(diào)用的是TChineseMan.sayHello
?????
?????//如果想要APerson調(diào)用TChineseMan.sayHello方法?應(yīng)該采取強(qiáng)制類(lèi)型轉(zhuǎn)換,強(qiáng)制類(lèi)型轉(zhuǎn)換其實(shí)就是對(duì)象框架的范圍調(diào)整
?????TChinesePerson(APerson).SayHello('是一名中國(guó)人');?//此時(shí)調(diào)用的是TChineseMan.sayHello?????
????end;
????
<8>??可見(jiàn)性
??Delphi中四種類(lèi)成員的保護(hù)方式:published,public,protected,private;???
??published,public?是可以最大訪問(wèn),protected是對(duì)之類(lèi)是可見(jiàn)的,private是對(duì)子類(lèi)不可見(jiàn)
??另外對(duì)象變量如果與其類(lèi)的聲明在同一個(gè)單元中,則private,protected失去作用,全部都是public
??有點(diǎn)類(lèi)似C++中友元的概念
??Example
??類(lèi)TMan和此函數(shù)在同一個(gè)單元
??procedure?TForm1.Button1Click(Sender:?TObject);
??var
????APerson:TMan;
??begin
????TMan.Sing;?
????APerson.FAge:=10;//雖然FAge是private?,但是此處確可以訪問(wèn)??
????APerson:=TMan.Create;
????APerson.Name:='小李';
????APerson.SayHello('?是一名中國(guó)人');
??end;?

<<Delphi面向?qū)ο缶幊?gt;>讀書(shū)筆記之二
<1>什么是對(duì)象
?A.對(duì)象是一組相關(guān)代碼和數(shù)據(jù)的組合.面向?qū)ο蟪绦蛟O(shè)計(jì)中,過(guò)程(函數(shù))被成為方法,數(shù)據(jù)被稱(chēng)做屬性(注意此處的屬性和類(lèi)中property不是一回事)
?B.對(duì)象之間可以通過(guò)發(fā)送消息請(qǐng)求而互相聯(lián)系,一個(gè)消息通常由三部分組成:接收對(duì)象的名字,對(duì)象成員的名字(方法和property),對(duì)象成員的參數(shù)
?C.對(duì)象是有類(lèi)型的,不同的對(duì)象是屬于不同的類(lèi)型.

?

轉(zhuǎn)載于:https://www.cnblogs.com/stevenlaz/p/3166406.html

總結(jié)

以上是生活随笔為你收集整理的Delphi中静态方法重载还是覆盖的讨论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。