這是
當前不是
可能爲泛型類聲明類類型。
查看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