日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本黄色中文字幕 | 大地资源中文在线观看免费版 | 国产尤物在线视频 | 一本大道av | 97免费人妻无码视频 | 黄色录像a级片 | 人成在线视频 | 日本三级韩国三级三级a级按摩 | 黄色网址在线播放 | 亚州av在线播放 | 国产男人的天堂 | 色男天堂| 欧美日韩3p | 久久超| 喷水少妇 | 精品人妻人伦一区二区有限公司 | 国产福利在线观看视频 | 欧洲亚洲视频 | 都市激情久久 | 午夜一级大片 | 日韩不卡一区二区 | 久久久久久久国产 | 中文字幕一区二区三区在线播放 | 国产精品99久久久久久人 | 国产日韩中文 | 爱操影院 | 精品久久二区 | 国产51自产区 | 亚洲激情小视频 | 国产精品入口66mio | 国产精品久久毛片av大全日韩 | 成人av网站免费 | 一区二区不卡免费视频 | 91天天干| 国产精品粉嫩 | 四虎成人精品在永久免费 | 亚洲精品资源 | 中国一级片在线观看 | 清纯唯美亚洲激情 | 18禁网站免费无遮挡无码中文 | 国产黄片一区二区三区 | 亚洲精品伦理 | 影音先锋黄色资源 | 91av小视频 | 国产91免费 | 99视频网 | 69xx国产| 国产无套精品一区二区 | 国产麻豆成人传媒免费观看 | 美女扒开粉嫩尿口 | 国产女人18毛片水真多18精品 | 99午夜视频| av在线收看 | 一区欧美| 日韩精品亚洲一区 | 欧美精品一区二区蜜臀亚洲 | 欧美精品做受xxx性少妇 | 日本护士取精xxxxxhd | 久久老熟女一区二区三区 | 久久丫精品忘忧草西安产品 | 一区二区三区在线播放 | 国产黄色免费在线观看 | 久久久久久久国产精品美女 | 国产日韩精品在线 | 国产精品久久久久久久久久小说 | 日本老小玩hd老少配 | 人妻少妇精品久久 | 超碰人人人人人 | 欧美激情四区 | 日韩高清在线一区二区 | 成av在线 | 国产sm网站| 爽爽影院在线 | 亚洲黄网在线 | 黄色a在线| 国产精品一区在线播放 | 国产a三级| 伊人天堂av| 国产精品爽爽久久久久久 | 中文字幕一区二区在线观看 | 日本午夜免费福利视频 | 国产特级毛片aaaaaa | 久久久久成人片免费观看蜜芽 | 国产高清视频在线 | 国产精品一区二区无码对白 | 亚洲成成品网站 | 国产在线自 | 波多野结衣亚洲天堂 | 国产精品视频a | 丝袜av在线播放 | 精品少妇人妻av一区二区三区 | 男女视频免费 | 性欧美巨大| 91福利在线播放 | 雪白的扔子视频大全在线观看 | 美国特色黄a大片 | 在线不卡欧美 | av老司机在线 | free性欧美hd精品4k |