2013-03-24 5 views
4

내가 클래스 TLuaClassTemplate<T: TControl, constructor> = class이 그것을 사용하려고은 TDictionary일반 TControl 매개 변수로 TControlClass?

TClassNameToComponentDict = TDictionary<string, TControlClass>; 
    TClassNameToComponentPair = TPair<string, TControlClass>; 

... 
    ClassNameToComponent := TClassNameToComponentDict.Create; 
    ClassNameToComponent.Add('TButton', TButton); 
    ClassNameToComponent.Add('TPanel', TPanel); 
    ClassNameToComponent.Add('TEdit', TEdit); 

에 저장 TControlClass 참조와 방법 class procedure RegisterClass(L: Plua_State; p: TPrintProc; container: TComponent; vm: TLuaVm); static;이다 그러나 나는 (이

enum: TClassNameToComponentPair; 
    ctx: TRttiContext; 
    cls: TControlClass; 
begin 
    for enum in vm.ClassNameToComponent do begin 
    //TLuaClassTemplate<enum.Value>.RegisterClass(vm.LS, PrintGlobal, container, vm); 
    cls := TControlClass((ctx.FindType(enum.Key) as TRttiInstanceType).MetaClassType); 
    TLuaClassTemplate<cls>.RegisterClass(vm.LS, PrintGlobal, container, vm); 
    end; 

내가 모두 현재 볼을 시도했습니다 사용하는 시도에서 문제가 검색으로 찾음) 및 옵션에 주석을 달았습니다. 그러나 오류는 Undeclared identifier: 'TLuaClassTemplate'이고 TLuaClassTemplate<TButton>.RegisterClass(vm.LS, PrintGlobal, container, vm);은 작동합니다.

여기서 TControlClass를 제네릭 매개 변수로 어떻게 사용할 수 있습니까?

+0

감사합니다. 계속 좋은 질문을합니다. 나는 그들에게 잘 질문하고 흥미 있기 때문에 투표를 계속한다! –

답변

4

제네릭을 인스턴스화하려면 형식 인수가 컴파일 타임에 알려져 있어야합니다. 코드 cls은 컴파일시 알 수 없으므로 런타임에만 결정됩니다. 그리고 그 뜻은 TLuaClassTemplate<cls>이 generic의 잘못된 인스턴스입니다.

여기서 핵심은 generics가 코드의 매개 변수화를 제공하지만 컴파일 타임에 매개 변수를 제공해야한다는 것입니다. 런타임까지 매개 변수를 알지 못하므로 generics를 사용하여 문제를 해결할 수 없습니다.

글쎄, 내가 할 수는 없지만 RTTI를 사용하여 일반적인 방법을 호출 할 수는 있습니다. 그렇게하려면 가능한 각 인스턴스화 된 유형이 실행 파일의 유형 목록에 포함되어 있는지 확인해야합니다. 그러나 제네릭의 목적을 정말로 무너 뜨릴 모든 것을하십시오! 컴파일 시간의 일반적인 인수 대신 표준 런타임 인수를 사용하는 것이 훨씬 더 쉽습니다.

관련 문제