这是
当前不是
可能为泛型类声明类类型。
查看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>
”是不可能的,但是一个泛型类的副本是好的。
难道不可能的'TMyType'所有用户从单元B指?在这种情况下,您的解决方法可能是可行的。 –
2012-04-08 11:15:02
为什么不创建一个界面并将其暴露给用户? – whosrdaddy 2012-04-08 18:38:21