gpt4 book ai didi

Delphi RTTI 动态转换

转载 作者:行者123 更新时间:2023-12-03 18:44:42 34 4
gpt4 key购买 nike

假设我有:

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 .当然只能调用 aTClassA 上声明的方法(或在 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;
  • 关于Delphi RTTI 动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359117/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com