Delphi RTTI动态转换

问题描述 投票:2回答:1

让我们说我有:

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。当然,我只能调用在a上声明的TClassA方法(或者在TClassB中被覆盖的方法)。

如果我想使用a并且可以访问C ++中TClassB中的ALL方法,我会在C ++ RTTI中使用dynamic_cast(和typeid一起使用)。我怎样才能使用Delphi的RTTI来做到这一点?

delphi
1个回答
0
投票

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

  • 模式1:如果转换失败,我想要一个例外:这是通过使用as运算符来实现的,该运算符执行正确的类型检查,然后在可能的情况下转换对象。如果失败,将抛出ClassCastExceptionb:= 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;
© www.soinside.com 2019 - 2024. All rights reserved.