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,因此您可以优雅地 //在这里采取正确的行动,不捕捉任何异常 结束代码>
那样做,如果(a是TClassB),那么b:=(a是TClassB);否则将升高…
。不要把Delphi RTTI与C++ RTTI混合。<代码>是和as
执行与is
相同的类型检查。不同之处在于,is
返回布尔值,而as
执行实际强制转换,如果未找到匹配项,则引发异常。因此,如果首先使用is
,然后使用,因为是冗余开销,那么只需使用普通类型转换即可:如果(a是TClassB),那么b:=TClassB(a)
,否则根本不要使用is
:b:=a作为TClassB代码>