いつでも何らかの種類のレジストリ (文字列リストまたは辞書によって管理される) に型を登録し、ファクトリ関数を作成して適切なオブジェクトを返すことができます。残念ながら、必要になるタイプを事前に知っておく必要があります。Delphi 関数の RegisterClass および FindClass に似たもの(クラス ユニット内)。私の考えは、一般的なテンプレートの型を直接リストに入れることです。
可能な使用例:
RegisterCustomType('Integer',TSomeType<Integer>);
RegisterCustomType('String',TSomeType<String>);
if FindCustomType('Integer') <> nil then
O := FindCustomType('Integer').Create;
編集: Generics.Collections の tDictionary を使用してレジストリ ストレージを処理する特定の単純な実装を次に示します。読者の簡単な演習として、これを有用なメソッドに抽出したままにします。
var
o : TObject;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) then
ShowMessage(o.ClassName);
end;
別の編集:昨夜これについて考えていたところ、この概念に統合できる別の手法を発見しました。インターフェイス。何もしない簡単な例を次に示しますが、簡単に拡張できます。
TYPE
ITest = interface
['{0DD03794-6713-47A0-BBE5-58F4719F494E}']
end;
TIntfList<t> = class(TList<T>,ITest)
public
function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
o : TObject;
fTestIntf : ITest;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TIntfList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) and Supports(o,ITest,fTestIntf) then
ShowMessage(o.ClassName);
end;
もちろん、QueryInterface、_AddRef、および _Release メソッドを実装し、インターフェイスを拡張して、より便利なことを行う必要があります。