program Project1;
{$MODE OBJFPC}
uses fgl;
type
{ TBase }
TBase = class
class function FromData(data: string): TBase;virtual;
class procedure RegisterSelf;
end;
TBaseClass = class of TBase;
TClassesList = specialize TFPGMap<string, TBaseClass>;
{ TChild1 }
TChild1 = class(TBase)
class function FromData(data: string): TBase;override;
end;
TSomeList = specialize TFPGMap<string, TChild1>;
var
aClasses: TClassesList;
SomeList: TSomeList;
{ TChild1 }
class function TChild1.FromData(data: string): TBase;
begin
if data = '' then
Result:=inherited FromData('default')
else
begin
writeln('Finding '+ClassName+' by name: '+data);
Result := SomeList.KeyData[data];
end;
end;
class function TBase.FromData(data: string): TBase;
begin
writeln('created new '+ClassName+' with params: '+data);
Result := self.Create;
end;
class procedure TBase.RegisterSelf;
begin
if not Assigned(aClasses) then aClasses := TClassesList.Create;
aClasses.Add(ClassName,TBaseClass(ClassType));
end;
const
SavedFile: array[1..4, 1..2] of string =
(
('TBase','123'),
('TBase','test'),
('TChild1',''),
('TChild1','test')
);
function StrToClass(s: string): TBaseClass;
begin
Result := aClasses.KeyData[s];
end;
var
i: integer;
begin
TBase.RegisterSelf;
TChild1.RegisterSelf;
SomeList := TSomeList.Create;
SomeList.Add('test', TChild1.Create);
for i := 1 to 4 do
StrToClass(SavedFile[i, 1]).FromData(SavedFile[i, 2]);
readln;
end.
cHJvZ3JhbSBQcm9qZWN0MTsKeyRNT0RFIE9CSkZQQ30KdXNlcyBmZ2w7Cgp0eXBlCgogIHsgVEJhc2UgfQoKICBUQmFzZSA9IGNsYXNzCiAgICBjbGFzcyBmdW5jdGlvbiBGcm9tRGF0YShkYXRhOiBzdHJpbmcpOiBUQmFzZTt2aXJ0dWFsOwogICAgY2xhc3MgcHJvY2VkdXJlIFJlZ2lzdGVyU2VsZjsKICBlbmQ7CgogIFRCYXNlQ2xhc3MgPSBjbGFzcyBvZiBUQmFzZTsKICBUQ2xhc3Nlc0xpc3QgPSBzcGVjaWFsaXplIFRGUEdNYXA8c3RyaW5nLCBUQmFzZUNsYXNzPjsKCiAgeyBUQ2hpbGQxIH0KCiAgVENoaWxkMSA9IGNsYXNzKFRCYXNlKQogICAgY2xhc3MgZnVuY3Rpb24gRnJvbURhdGEoZGF0YTogc3RyaW5nKTogVEJhc2U7b3ZlcnJpZGU7CiAgZW5kOwoKICBUU29tZUxpc3QgPSBzcGVjaWFsaXplIFRGUEdNYXA8c3RyaW5nLCBUQ2hpbGQxPjsKCnZhcgogIGFDbGFzc2VzOiBUQ2xhc3Nlc0xpc3Q7CiAgU29tZUxpc3Q6IFRTb21lTGlzdDsKCnsgVENoaWxkMSB9CgpjbGFzcyBmdW5jdGlvbiBUQ2hpbGQxLkZyb21EYXRhKGRhdGE6IHN0cmluZyk6IFRCYXNlOwpiZWdpbgogIGlmIGRhdGEgPSAnJyB0aGVuCiAgICBSZXN1bHQ6PWluaGVyaXRlZCBGcm9tRGF0YSgnZGVmYXVsdCcpCiAgZWxzZQogIGJlZ2luCiAgICB3cml0ZWxuKCdGaW5kaW5nICcrQ2xhc3NOYW1lKycgYnkgbmFtZTogJytkYXRhKTsKICAgIFJlc3VsdCA6PSBTb21lTGlzdC5LZXlEYXRhW2RhdGFdOwogIGVuZDsKZW5kOwoKCmNsYXNzIGZ1bmN0aW9uIFRCYXNlLkZyb21EYXRhKGRhdGE6IHN0cmluZyk6IFRCYXNlOwpiZWdpbgogIHdyaXRlbG4oJ2NyZWF0ZWQgbmV3ICcrQ2xhc3NOYW1lKycgd2l0aCBwYXJhbXM6ICcrZGF0YSk7CiAgUmVzdWx0IDo9IHNlbGYuQ3JlYXRlOwplbmQ7CgpjbGFzcyBwcm9jZWR1cmUgVEJhc2UuUmVnaXN0ZXJTZWxmOwpiZWdpbgogIGlmIG5vdCBBc3NpZ25lZChhQ2xhc3NlcykgdGhlbiBhQ2xhc3NlcyA6PSBUQ2xhc3Nlc0xpc3QuQ3JlYXRlOwogIGFDbGFzc2VzLkFkZChDbGFzc05hbWUsVEJhc2VDbGFzcyhDbGFzc1R5cGUpKTsKZW5kOwoKCmNvbnN0CgogIFNhdmVkRmlsZTogYXJyYXlbMS4uNCwgMS4uMl0gb2Ygc3RyaW5nID0KICAgICgKICAgICgnVEJhc2UnLCcxMjMnKSwKICAgICgnVEJhc2UnLCd0ZXN0JyksCiAgICAoJ1RDaGlsZDEnLCcnKSwKICAgICgnVENoaWxkMScsJ3Rlc3QnKQogICAgKTsKCmZ1bmN0aW9uIFN0clRvQ2xhc3Moczogc3RyaW5nKTogVEJhc2VDbGFzczsKYmVnaW4KICBSZXN1bHQgOj0gYUNsYXNzZXMuS2V5RGF0YVtzXTsKZW5kOwoKCnZhcgogIGk6IGludGVnZXI7CmJlZ2luCiAgVEJhc2UuUmVnaXN0ZXJTZWxmOwogIFRDaGlsZDEuUmVnaXN0ZXJTZWxmOwoKICBTb21lTGlzdCA6PSBUU29tZUxpc3QuQ3JlYXRlOwogIFNvbWVMaXN0LkFkZCgndGVzdCcsIFRDaGlsZDEuQ3JlYXRlKTsKCiAgZm9yIGkgOj0gMSB0byA0IGRvCiAgICAgIFN0clRvQ2xhc3MoU2F2ZWRGaWxlW2ksIDFdKS5Gcm9tRGF0YShTYXZlZEZpbGVbaSwgMl0pOwoKICByZWFkbG47CmVuZC4K