当前无法为泛型类声明类类型。
有关详细信息,请参阅QC76605。还有下面的更新。
例子 :
TMyClass<T> = class
end;
TMyClassClass<T> = class of TMyClass<T>; //E2508 type parameters not allowed on this type
提出的解决方法如下所示:
TMyIntClass = TMyType<Integer>;
TMyIntClassClass = Class of TMyIntClass;
但是正如评论的那样,这将破坏泛型的整个想法,因为必须为每个泛型实例化该类。
这里还有一个链接,指向生成泛型类型的专用子类的类似解决方法:derive-from-specialized-generic-types。在这种情况下,它看起来像这样:
TMySpecialClass = Class(TMyType<Integer>);
更新 :
RM提出的解决方法:
TMyType<T> = class(a.TMyType<T>);
可以使用以下方案实现类型安全:
unit Unita;
interface
type
TMyType<T> = class
Constructor Create;
end;
implementation
uses
Unitb;
constructor TMyType<T>.Create;
begin
Inherited Create;
//WriteLn( Self.QualifiedClassName,' ',Unitb.TMyType<T>.QualifiedClassName);
Assert(Self.QualifiedClassName = Unitb.TMyType<T>.QualifiedClassName);
end;
end.
unit Unitb;
interface
uses Unita;
type
TMyType<T> = class(Unita.TMyType<T>);
implementation
end.
Project Test;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
Unita in 'Unita.pas',
Unitb in 'Unitb.pas';
var
t1 : Unita.TMyType<Integer>;
t2 : Unitb.TMyType<Integer>;
t3 : TMyType<Integer>;
begin
try
//t1 := Unita.TMyType<Integer>.Create; //Exception EAssertionFailed !!
t2 := Unitb.TMyType<Integer>.Create;
t3 := TMyType<Integer>.Create;
ReadLn;
finally
//t1.Free;
t2.Free;
t3.Free;
end;
end.
创建泛型类时,会进行测试以检查创建的类是否派生自单元 b 中声明的类型。从而检测到所有从单元 a 创建此类的尝试。
更新 2:
为了清楚起见,对泛型类的引用“ class of type<T>
”是不可能的,但是泛型类的副本是可以的。