Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi RTTI动态浇铸_Delphi - Fatal编程技术网

Delphi RTTI动态浇铸

Delphi RTTI动态浇铸,delphi,Delphi,假设我有: type TClassA = class function prova: integer; virtual; function provaSuA: integer; virtual; end; type TClassB = class(TClassA) function prova: integer; override; function provaSuB: integer; virtual; end; 然后我使用这个代码: procedure TForm

假设我有:

type
 TClassA = class
  function prova: integer; virtual;
  function provaSuA: integer; virtual;
 end;

type
 TClassB = class(TClassA)
  function prova: integer; override;
  function provaSuB: integer; virtual;
 end;
然后我使用这个代码:

procedure TForm1.Button1Click(Sender: TObject);
var a: TClassA;
    b: TClassB;
begin
 Memo1.Clear;

 a := TClassB.Create;
 try

  b := ?? //dynamic_cast on C++

  Memo1.Lines.Add(a.prova.ToString);
  Memo1.Lines.Add(b.provaSuB.ToString);

 finally
  a.Free;
 end;

end;
我使用的是多态性,a的静态类型是
TClassA
,而动态类型是
TClassB
。当然,我只能调用在
TClassA
上声明的
a
方法(或者在
TClassB
中重写的方法)

<>如果我想使用<代码> A/Eng>,并且可以访问C++中TClassB中的所有方法,我将使用<代码>动态DealCysCase<代码>(C++中的Type ID)。如何使用Delphi的RTTI来实现这一点?

Delphi“RTTI”的含义与C++的略有不同。要复制
dynamic_cast
的功能,您需要遵循以下两种模式之一:

  • 模式1:如果强制转换失败,我想要一个例外:这是通过使用
    as
    操作符实现的,该操作符执行正确的类型检查,然后在可能的情况下强制转换对象。如果失败,将抛出一个
    ClassCastException

    b:=a作为TClassB

  • 模式2:如果强制转换失败,我想手动处理它:这是通过使用
    is
    操作符来实现的,该操作符严格执行有关强制转换的测试。然后,您需要在成功时手动强制转换(查看代码中的注释):

    如果(a是TClassB),则
    开始
    //这是一个演员阵容,然而,在这种情况下,你只是在解释
    //由a指向的类型为ClassB的类的内存。您没有使用任何运算符。
    b:=TClassB(a);
    结束
    其他的
    开始
    //在这里,您知道a不能被转换为TClassB,因此您可以优雅地
    //在这里采取正确的行动,不捕捉任何异常
    结束


您不需要在delphi上进行RTTI。只需在if-then中使用IS关键字来检查子类型是否有效,如果有效,则使用AS关键字进行转换!像
那样做,如果(a是TClassB),那么b:=(a是TClassB);否则将升高…
。不要把Delphi RTTI与C++ RTTI混合。<代码>是和作为< /Cord>,依赖于Delphi RTTI,正如<代码>动态CaseStudio依赖C++ RTTI。还要注意,
as
执行与
is
相同的类型检查。不同之处在于,
is
返回布尔值,而
as
执行实际强制转换,如果未找到匹配项,则引发异常。因此,如果首先使用
is
,然后使用
,因为
是冗余开销,那么只需使用普通类型转换即可:
如果(a是TClassB),那么b:=TClassB(a)
,否则根本不要使用
is
b:=a作为TClassB