zoukankan      html  css  js  c++  java
  • delphi中as,is关键字是如何工作的?

    我的问题是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,不是吗?
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    TPLINK GPL code 简要分析
    Openwrt 初探
    物联网-手机远程控制家里的摄像头(3)
    物联网-手机远程控制家里的摄像头(2)
    lumia 520无法开机
    树莓派无法驱动移动硬盘
    Cannot Change Opencv Webcam Setting
    IIC协议理解(转)
    应用调试(六)记录回放输入子系统
    应用调试(五)侵入式SWI
  • 原文地址:https://www.cnblogs.com/jijm123/p/15292669.html
Copyright © 2011-2022 走看看