对象的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;
  • 如何检查上述代码中的对象类型?我尝试输入信息,但消息从未执行

  • 如何访问子类公共字段?就这样

  • TAnimal(livingThing)。Legsunt=3

    它的类型安全时尚?或者有什么更好的方法来完成这个案子

    谢谢你的建议

    试试这个:

    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 ...