[英]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.