언제든지 유형을 레지스트리 (문자열 목록 또는 사전으로 관리)에 등록하고 팩토리 함수를 만들어 적절한 객체를 반환 할 수 있습니다. 불행하게도 필요한 유형을 미리 알아야합니다. 델파이 함수는 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 메소드를 구현하고 더 유용한 일을하기 위해 인터페이스를 확장해야합니다.
내가 만든 개체로 어떤 종류의 "물건"을 기대하십니까? –
인터페이스를 가져옵니다. 그것은 지속성 계획의 일부입니다. – TrespassersW
누가 당신이 "잡을 수있는"인터페이스를 가지고 있다고 말합니까? 특정 인터페이스를 구현한다는 것을 아는 유형에 대해 충분히 알고 있다면 위의 코드 스 니펫이 수행하는 작업을 수행 할 필요가 없다는 것을 충분히 알고 있습니다. –