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)の書き方ができるなんて、今日初めて知った(^^ゞ
もしよければ、「こんな方法もあるよ」というのも募集してみます。
ツイート | ![]() |