- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

クラス参照型とオブジェクトの複製のテスト Edit

 program Project;
 {$APPTYPE CONSOLE}
 uses
   SysUtils;
 type
   TTestAClass = class of TTestA;

   TTestA = class
   private
     FTestString: string;
   public
     constructor Create(const aTestString: string); virtual;
     procedure Print;

     function Clone: TTestA;
   end;

   TTestB = class(TTestA)
   public
     constructor Create(const aTestString: string); override;
   end;

 { TTestA }
 constructor TTestA.Create(const aTestString: string);
 begin
   FTestString := aTestString;
 end;

 procedure TTestA.Print;
 begin
   Writeln(FTestString + '@' + ClassName);
 end;

 function TTestA.Clone: TTestA;
 begin
   Result := TTestAClass(ClassType).Create(FTestString);
 end;

 { TTestB }
 constructor TTestB.Create(const aTestString: string);
 begin
   inherited;
   FTestString := AnsiUpperCase(FTestString);
 end;

 var
   TestA1, TestA2, TestA3: TTestA;
   TestB1, TestB2: TTestB;
 begin
   try
     TestA1 := TTestA.Create('123abc');
     TestA1.Print;

     TestA2 := TestA1.Clone;
     TestA2.Print;

     TestB1 := TTestB.Create('123abcabc');
     TestB1.Print;
     TestB2 := TestB1.Clone as TTestB;
     TestB2.Print;

     TestA3 := TestB1.Clone;
     TestA3.Print;
   finally
     TestA1.Free;
     TestA2.Free;
     TestA3.Free;
     TestB1.Free;
     TestB2.Free;
   end;

   Writeln(Eoln);
 end.

以下、実行結果

123abc@TTestA
123abc@TTestA
123ABCABC@TTestB
123ABCABC@TTestB
123ABCABC@TTestB

肝はこれ。

Result := TTestAClass(ClassType).Create(FTestString);

Createは、しっかり多態してくれる。
おかげで、TTestBのインスタンスからCloneを呼ぶと、TTestBのCreateが呼ばれ、
TTestBの複製されたインスタンスが返る。



Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2004-12-15 Wed 06:16:17 JST (5297d)