目前无法为泛型类声明类类型。
有关更多信息,请参见QC76605和下面的更新。
示例:
TMyClass<T> = class
end
TMyClassClass<T> = class of TMyClass<T>
提出的解决方法如下:
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;
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
t2 := Unitb.TMyType<Integer>.Create;
t3 := TMyType<Integer>.Create;
ReadLn;
finally
t2.Free;
t3.Free;
end;
end.
创建泛型类时,会进行测试以检查创建的类是否是从单元b中声明的类型派生而来。这样就可以检测到从单元a尝试创建此类的所有尝试。
更新2:
需要明确的是,对于泛型类的引用 "
class of type<T>
" 是不可能的,但复制一个泛型类是可以的。
TMyType<T>
的用户都无法从单元 b 引用吗?如果是这种情况,那么您的解决方法可能可行。 - LU RD