Mam nieograniczony typ generyczny Atomic, który implementuje inicjalizator (szczegóły w moim previous question).Tworzenie instancji obiektu na podstawie nieograniczonego typu generycznego
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
Teraz chcę napisać funkcję Initialize uproszczone, które zajęłoby się z informacjami od typu T (pod warunkiem, że typeof (T) jest tkClass) i utworzyć nową instancję (jeśli to konieczne) z domyślnego konstruktora.
Niestety, to się nie powiedzie:
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
kompilator zgłasza błąd E2571 Type parameter 'T' doesn't have class or interface constraint
.
Jak mogę oszukać kompilator, aby utworzyć wystąpienie klasy T?
Dzięki, ale sednem problemu z XE2 Update 2 jest to, że TypeInfo (T) nie skompiluje się, jeśli T nie jest oznaczone ograniczeniem "class". – gabr
Nie wiedziałem tego. Czy jest to "funkcja" lub błąd? – Linas
Nie jestem pewien, ale obawiam się, że to funkcja. – gabr