あるクラスと同じクラスをCreateしたいときに


ん?  2006-07-27 19:09:07  No: 22730

Delphi 5 で開発していますので、それ以下のバージョンでは使えないかもしれません。

TA=class
TB=class(TA)
TB1=class(TA)
TC=class(TB)
TC1=class(TB1)

TAClass = class of TA;

・・・などと、基本クラス「TA」に対し、いくつも派生したクラス群があります。
それでは、基本クラスである「TA」の実装部で、自分自身のコピーインスタンスが
必要になったとき、どうしています?

条件
・TAの継承クラスは、それぞれ別のユニットに記述されている
・派生が多岐にわたるので、is 演算子等による比較は行いたくない。

(1)安全に、このような、自分自身のインスタンスを作成するメソッドを作成し、
以下の継承クラスには、すべて同じメソッドを準備させる。

function TA.CreateCopy:TA; virtual;
begin
  Result := TA.Create;
end;
function TB.CreateCopy:TA; override;
begin
  Result := TB.Create;
end;

(2)楽して、これ一つで済ませる。

function TA.CreateCopy: TA;
begin
  Result := TAClass(ClassType).Create;
end;

(3)もしくは、メソッドすら用意せず、必要な場所で
var
  aaa: TA;
  bbb: TB;
begin
  ...
  aaa := TAClass(bbb.ClassType).Create;
  ...
end;

(2)も(3)も、宣言されているクラスや型ではなく、実体のクラス
と同じものがクリエイトされることを確認しています。
(3)の場合、bbb の実体が TC とすると、aaa の実体も TC になり、
宣言された型のインスタンスではなく、実体(TC)と同じクラスが
クリエイトされます

でも、(2),(3)の書き方ができるなんて、今日初めて知った(^^ゞ

もしよければ、「こんな方法もあるよ」というのも募集してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加