Delphi XE2 で、Copy(owntype) メソッドが必要なオブジェクトを操作するジェネリック コレクション クラスを作成したいのですが、これを宣言する最善の方法がわかりません。
この例のようなものが必要です (簡単にするために、1 つのアイテムのコレクション)。
//------ Library ------
Type
TBaseCopyable = class
S: string;
// procedure Copy(OtherObject: TBaseCopyable); overload;
procedure Copy(OtherObject: TBaseCopyable); virtual;
end;
MyCollection<T: TBaseCopyable, constructor> = class
TheItem: T;
procedure SetItem(AItem: T);
function GetItem: T;
end;
[...]
function MyCollection<T>.GetItem: T;
Var
NewItem: T;
begin
NewItem := T.Create;
NewItem.Copy(TheItem);
Result := NewItem;
end;
//------ Usage ------
Type
TMyCopyable = class(TBaseCopyable)
I: integer;
// procedure Copy(OtherObject: TMyCopyable); overload;
procedure Copy(OtherObject: TMyCopyable); override;
end;
[...]
Col: MyCollection<TMyCopyable>;
重要な問題は、Col では、TMyCopyable.Copy を見つけるために MyCollection の汎用実装が必要なことです。当然のことながら、過負荷も仮想も仕事をしません。
- オーバーロードを使用すると、コードはコンパイルされますが、MyCollection.GetItem は TMyCopyable.Copy ではなく TBaseCopyable.Copy を検出します。
- virtual/override では、2 つの Copy 宣言の署名が一致しないため、これはコンパイルされません。
したがって、おそらく継承の代わりに、TBaseCopyable の仕様でジェネリックを使用する必要があると考えています。しかし、主に型パラメーターを TBaseCopyable に渡す必要が特にないため、どのようにすればよいかわかりません。単に Copy 引数の型が「それ自身のクラスの型」を一般的な方法で参照する必要があるだけです。
アイデア?ありがとう!