对象之间的比较为什么只能用IS而不能用”=”?(100分)

  • 主题发起人 主题发起人 Kingda
  • 开始时间 开始时间
K

Kingda

Unregistered / Unconfirmed
GUEST, unregistred user!
欢迎大家讨论对象之间的比较的底层实现!
 
对象是一个存在的事物。  而 = 号是 逻辑表达式。是要得出逻辑结果的。
 
as ,is 是delphi中对象的rtti信息的比较与转换用的运算符。
as:多用于转换;
is:多用于比较;

for i:=componetcount-1 downto o do
if componets is tedit then//---判断控件是不是TEDIT控件
(componets as tedit).text:='aaa';//---将当前控件强制转换为TEDIT类并为
其TEXT属性赋值 AAA
 
不一样,
is 是用来判断 一个对象在运行时 是哪个类的,

= 是关系运算符,是用来判断两个对象是否一样,或是不是同一 个。

所以,楼主说的“对象之间的比较为什么只能用IS” 不太合适。一般是这样用的:
object is class
左边是对象 ,右边是类。

而,= 是 object1 = object2,两边都是相同的。

:P
 
Edit1 is TEdit ........ true
Edit1 is TWinControl ........ true
如果用 = , 那么 Edit1 = TEdit呢, 还是 Edit1=TWinControl, 所以不能用 =
 
我们大家都清楚 Aobject is Aclass 没错是用来判断Aobject对象是否属于AClass类.
我想问的是IS关键词如何在Delphi底层实现语言层面的上述判断.

我以为:

对象其实是一个指针,指向该对象的内存空间.而对象空间的头四个字节其实也是个指针,这里我们暂定位指针A,指向给对象直属类的VMT表.is关键词是不是通过判断指针A的指向来判断该对象属于该直属类?如果判断的不是直属类,而是一个祖先类,is关键词又是如何判断的呢?

欢迎大家继续指正.
 
每个类的VMT中保存有它的父类的VMT的指针。
 
to dedema:

类的类型是否在delphi底层就相当于一个指向VMT的指针?
 
你这么想就好理解了,小轿车是属于(is)汽车呢?还是等于(=)汽车??
 
to app2001:

这个道理我懂,现在我想关注的是底层实现.
 
哦,那么我认为这个是制订下来的规则,就好象大家都叫太阳做太阳,而不是管它叫罗卜一样。规则的东西,似乎没有什么道理讲的吧?个人认为的说
 
这不是规则问题,我的目的只想和大家探讨一下实现的原理!
 
我觉得
=:是判断是否指向同一地址(如果是,肯定是同一东西)
Is:是判断是否这一类。
 
既然你想知道底层实现,那么写一个语句,然后调试跟踪汇编代码。(Delphi的源码当中也是汇编而不是PAS)。
原理就是
function ObjIsClass(aObj, aClass): Boolean;
begin
Result:= aObj.ClassPtr = aClass;
while (Result = False) and Assigned(aClass.ParentClass) do
begin
aClass:= aClass.ParentClass;
Result:= aObj.ClassPtr = aClass;
end;
ebd;
 
谢谢上面的朋友,明天就回家过年了.
祝各位同行猴年大吉,万事如意.事业一帆风顺,生活甜甜蜜蜜!

 
多人接受答案了。
 
后退
顶部