Ответ 1
Это в настоящее время не можно объявить тип класса для общего класса.
Для получения дополнительной информации см. 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;
Но, как прокомментировано, это приведет к победе над всей идеей дженериков, поскольку класс должен быть подклассом для каждого общего экземпляра.
Здесь также ссылка на аналогичный обходной путь при создании специализированного подкласса родового типа: вывод из специализированных-общих типов. В этом случае это будет выглядеть так:
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>
" невозможна, но копия родового класса в порядке.