对象的delphi类型信息
我有如下代码对象的delphi类型信息,delphi,object,types,typeinfo,Delphi,Object,Types,Typeinfo,我有如下代码 TLivingThing=class end; THuman=class(TLivingThing) public Language:String end; TAnimal=class(TLivingThing) public LegsCount:integer; end; procedure GetLivingThing() var livingThing:TLivingThing; begin livingThing:=TH
TLivingThing=class
end;
THuman=class(TLivingThing)
public
Language:String
end;
TAnimal=class(TLivingThing)
public
LegsCount:integer;
end;
procedure GetLivingThing()
var
livingThing:TLivingThing;
begin
livingThing:=THuman.Create();
if livingThing=TypeInfo(THuman) then ShowMessage('human');
livingThing:=TAnimal.Create();
if livingThing=TypeInfo(TAnimal) then ShowMessage('animal');
end;
procedure GetLivingThing();
var
livingThing:TLivingThing;
human:THuman;
animal:TAnimal;
begin
livingThing:=THuman.Create();
try
if livingThing is THuman then
begin
human:=livingThing as THuman;
ShowMessage('human');
end;
if livingThing is TAnimal then
begin
animal:=livingThing as TAnimal;
ShowMessage('animal');
end;
finally
livingThing.Free;
end;
end;
接线员有时会被误导。在您的情况下,一切正常,因为选中的类来自层次结构的最后一行。但是你的层次结构不正确。让我们考虑下面的例子(将执行多少IFS): 在此示例中,您将收到: 生命 塔尼马尔 图曼 如果你只想打一个如果,你错了。更好的解决办法是使用
if a.ClassName = TLivingThing.ClassName then ...
if a.ClassName = TAnimal.ClassName then ...
if a.ClassName = THuman.ClassName then ...
在这种情况下,将调用适当的if。如果在if链祖先和后代中使用,这一点非常重要。但类上的公共字段如何?我可以在我的问题上指定类似的代码吗?如果这不是一个只使用代码的答案,我可能会投赞成票。你的答案会好得多,如果你不用让大家猜测,而是花上几句话来说明你的代码与OP的不同之处以及为什么它会起作用。@navirius,在你的例子中,你是在做一个硬演员(TAnimal(livingThing).LegsCount)。这是一个不安全的演员阵容。要在运行时捕获错误,请使用(livingThing as TAnimal).legsunt。有关更多信息,请参阅。这绝不是一个更好的解决方案,而是资源密集型的解决方案。在您的情况下,正确订购if,然后使用“else if”。
if a.ClassName = TLivingThing.ClassName then ...
if a.ClassName = TAnimal.ClassName then ...
if a.ClassName = THuman.ClassName then ...