使用RTTI混淆继承

A B*_*A B 2 delphi class

如果问题不是按照规则,而是出于好奇,请原谅我,我只是想知道为什么我的物品classtype让我感到困惑。

请参见以下代码:

 type 
 TFirstClass = class
 end;

  TSecondClass = class(TFirstClass)
  end;

  TThirdClass = Class(TSecondClass)
  End;
Run Code Online (Sandbox Code Playgroud)

以上是我的课程结构。

在一种方法中,我只想检查类对象的类类型。

    var
      obj1: TFirstClass;
      obj2: TSecondClass;
      obj3 : TThirdClass;
      str: string;
    begin
      obj1 := TSecondClass.Create;
      obj2 := TThirdClass.Create;
      try
    if obj1 is TFirstClass then
        str  := str + ' obj1: first ||';

    if obj1 is TSecondClass then
        str  := str + 'obj1 : Second ||';

    if obj2 is TSecondClass then
        str  := str + 'obj2 : Second ||';

    if obj2 is TThirdClass then
        str  := str + 'obj2 : Third ||';

    ShowMessage(str);
   finally
        FreeandNil(Obj1);
        FreeandNil(Obj2);
      end;

    end;
Run Code Online (Sandbox Code Playgroud)

str的结果是 obj1:第一|| obj1:第二|| obj2:第二|| obj2:第三||

为什么is关键字对所有if语句都返回true ?

Dav*_*nan 7

文档有答案:

执行动态类型检查的is运算符用于验证对象的实际运行时类。表达方式:

object is class
Run Code Online (Sandbox Code Playgroud)

如果object是由class或其后代之一表示的类的实例,则返回True,否则返回False。

他们的关键短语是“或其后代之一”。


Rem*_*eau 5

TThirdClass从导出TSecondClass,从中导出TFirstClass。因此:

  • obj1TFirstClass本身就是一个。

  • obj2TSecondClass这也是一个TFirstClass

  • obj3(您已实例化了)还是TThirdClassWHICH还是TSecondClassWHICH TFirstClass

is运营商着眼于整个继承层次结构,并返回true,如果所请求的类类型中找到。如果要进行精确的类匹配,则需要直接比较类类型,例如:

if obj1.ClassType = TFirstClass then
  ...

if obj1.ClassType = TSecondClass then
  ...

if obj2.ClassType = TSecondClass then
  ...

if obj2.ClassType = TThirdClass then
  ...
Run Code Online (Sandbox Code Playgroud)