您可以随时将您的类型注册到某种注册表(由字符串列表或字典管理)并创建工厂函数,然后返回适当的对象。不幸的是,你必须事先知道你需要什么类型。类似于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方法和扩展接口做更有用的东西。
你希望你能用你创建的对象做什么样的“东西”? – 2009-11-03 17:08:38
从中获取一个接口。它是持久性方案的一部分。 – TrespassersW 2009-11-03 17:48:15
谁说它有一个可以“抓取”的界面?如果你对这个类型有足够的了解,知道它实现了一个特定的接口,那么你就足够了解不需要去做你上面的代码片断了。 – 2009-11-03 18:42:43