繁体   English   中英

Delphi RTTI动态投射

[英]Delphi RTTI dynamic cast

假设我有:

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中重写的TClassB )。

如果我想用a ,并获得在C中TClassB所有方法++我会使用一个dynamic_cast在C ++中RTTI是(与typeid的一起)。 如何使用Delphi的RTTI来做到这一点?

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

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

    b:= a as TClassB;

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

    if (a is TClassB) then begin // this is a cast, however, in this context, you are simply interpreting // the memory pointed by a as a class of type ClassB. You are not using any operator. b:= TClassB(a); end else begin // here you know that a cannot be cast to TClassB, therefore you can gracefully take // proper action here, without catching any exception end;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM