1

我有如下代码

 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;
  1. 如何检查上面代码的对象类型?我尝试了 typeInfo 但消息从未执行

  2. 如何访问子类公共字段?像这样?

TAnimal(livingThing).LegsCount=3;

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

谢谢你的建议

4

2 回答 2

4

尝试这个:

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;
于 2013-07-03T05:04:50.743 回答
-1

运营商有时会被误导。在您的情况下,一切都很好,因为检查的类来自层次结构的最后一行。但是您的层次结构不正确。让我们考虑以下示例(将执行多少个 if?):

TLivingThing = class
end;
TAnimal = class(TLivingThing)
end;
THuman = class(TAnimal)
end;
TWolf = class(TAnimal)
end;

procedure Check;
var 
   a: THuman;
begin
a := THuman.Create;
if a is TLivingThing then 
   begin
   MessageBox('TLivingThing');
   //Do something useful here
  end;
if a is TAnimal then 
   begin
   MessageBox('TAnimal');  
   //Do something useful here  
   end;
if a is THuman then 
   begin
   MessageBox('THuman');
   //Do something useful here
   end;
end;

在此示例中,您会收到: TLivingThing TAnimal THuman

如果你只想打电话给一个 if,那你就错了。更好的解决方案是使用

if a.ClassName = TLivingThing.ClassName then ...
if a.ClassName = TAnimal.ClassName then ...
if a.ClassName = THuman.ClassName then ...

在这种情况下,适当的 if 将被调用。如果您在 if 链祖先和后代中使用,这非常重要。

于 2013-07-03T18:05:27.083 回答