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. 子クラスの public フィールドにアクセスするにはどうすればよいですか? ちょうどこのような?

TAnimal(生きているもの).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 を 1 つだけ呼び出したい場合は、間違っています。より良い解決策は使用です

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 に答える