• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

delphi中as,is关键字是如何工作的?

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我的问题是delphi中as,is关键字是如何工作的?特别是as,它可以把一个类转换成另一个类我从delphi中的system。pas中截取as关键字代码请求给与讲解,再次感谢!!

procedure _AsClass
asm
{_> EAX left operand(class)
{ EDX VMT of right operand
{<_ EAX if left is derived from right ,else runtime
error }
TEST EAX,EAX
JE @@exit
MOV ECX,EAX
@@loop
MOV ECX,[ECX]
CMP ECX,EDX
JE @@exit
MOV ECX,[ECX].vmtParent
TEST ECX,ECX
JNE @@loop
{ do runtime error}
MOV AL,reInvalidCast
JMP error
@@exit:
end;

 

procedure _AsClass
asm
{_> EAX left operand(class)
{ EDX VMT of right operand
{<_ EAX if left is derived from right ,else runtime
error }
//上面的注释已经说的很清楚了:进入这个procedure后,eax放左值,edx放右值的vmt地址
//举个例子:假设: TA As TB
//编译后,就是把ta类的实例地址放到eax中,而tb的地址放在edx中好比较
//在system.pas中也有tobject的结构,这是vcl类库的基本结构,你自己去看看,有一个vmt
//4个字节一个记录,放的是地址

TEST EAX,EAX //首先判断eax是否为空,就是类的实例是否有效
JE @@exit
MOV ECX,EAX //如果有,把地址转移到ecx中,以好继续比较

@@loop
MOV ECX,[ECX]
CMP ECX,EDX
JE @@exit
MOV ECX,[ECX].vmtParent
TEST ECX,ECX
JNE @@loop
{ do runtime error}
//这就是一个循环,先判断ta是不是tb,如果不是,再看ta的父类是不是tb,循环比较,但
//tobject是没有父类的,所以比较到它就结束了
MOV AL,reInvalidCast
JMP error
//返回一个错误值,这样,这个as语句就返回0
@@exit:
end;
//整个比较过程,就是沿继承树上朔,不停的比较
回复 
 
 
faint!
别人问具体实现机制
 
这样一段汇编只会让人一头雾水啊大哥,我来给你讲讲:
假设现在有一个tspeedbutton,一个tbutton
(1)as:
if tspeedbutton as tbutton then bless else damn
(2)is:
if tspeedbutton is tbutton then bless else damn
在(1)中,程序会bless,因为delphi会把tspeedbutton强化转换为tbutton。
在(2)中,程序会damn,因为tspeedbutton不是tbutton。
为什么我选tspeedbutton和tbutton做例子呢,因为前者是后者的子类(派生出来的),tspeedbutton可以转化为tbutton。
其实也很简单,从英文字面上就可以看懂了,as/is,不是吗?

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap