哪位高手可以给解释delphi中is操作符的实现原理啊?多谢多谢 ( 积分: 50 )

  • 主题发起人 主题发起人 BeCalm
  • 开始时间 开始时间
B

BeCalm

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]哪位高手可以给解释delphi中is操作符的实现原理啊?多谢多谢
 
⊙ is 和 as 运算符的原理
==========================================================================

我们知道可以在运行期使用 is 关键字判断一个对象是否属于某个类,可以使用 as 关键字把某个对象安全地转换为某个类。在编译器的层次上,is 和 as 的操作是由 System.pas 中两个函数完成的。

{ System.pas }
function _IsClass(Child: TObject
Parent: TClass): Boolean;
begin
Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;

_IsClass 很简单,它使用 TObject 的 InheritsForm 函数判断该对象是否是从某个类或它的父类中继承下来的。每个类的 VMT 中都有一项 vmtParent 指针,指向该类的父类的 VMT。TObject.InheritsFrom 实际上是通过[递归]判断父类 VMT 指针是否等于自己的 VMT 指针来判断是否是从该类继承的。

{ System.pas }
class function TObject.InheritsFrom(AClass: TClass): Boolean;
var
ClassPtr: TClass;
begin
ClassPtr := Self;
while (ClassPtr <> nil) and (ClassPtr <> AClass) do
ClassPtr := PPointer(Integer(ClassPtr) + vmtParent)^;
Result := ClassPtr = AClass;
end;

as 操作符实际上是由 System.pas 中的 _AsClass 函数完成的。它简单地调用 is 操作符判断对象是否属于某个类,如果不是就触发异常。虽然 _AsClass 返回值为 TObject 类型,但编译器会自动把返回的对象改变为 Parent 类,否则返回的对象没有办法使用 TObject 之外的方法和数据。

{ System.pas }
function _AsClass(Child: TObject
Parent: TClass): TObject;
begin
Result := Child;
if not (Child is Parent) then
Error(reInvalidCast)
// loses return address
end;
 
其他关于RTTI的信息可去这里查看:http://blog.sina.com.cn/u/5591c079010007ce
 
zqw0117,多谢你的圆满解答,还有一个就是运行时,is怎么去调用这两个函数的,这个过程不知道能不能给小弟再描述一下,多谢了啊!
是不是is本身是一个指针,运行到is时,就会跳到这个函数这里啊?
也就是调用的过程大致是怎么样的呢?
 
接受答案了.
 
is和as语句,在编译器编译的时候,会自动编译成System中的_IsClass和_AsClass函数来处理的。
 
后退
顶部