Zitat von
Phoenix:
Dafür sind Generics aber nicht gedacht.
Och menno.
Nja, ich hab mir hier halt ein Problem geschaffen
und versuche dafür nun eine "nette" Lösung zu finden.
Nja, ich werde noch etwas rumspielen ... mal sehn, vielleicht finde ich ja noch eine andere Lösung, außer dem Interface.
Ich spiele grad so ein bissl rum und probiere mehreres aus.
So war ich erstmal bei den "kleineren" Records gelandet, aber so wie es aussieht, werde ich wohl oder übel auf Klassen umsteigen müssen, weswegen ich dann auf das oben genannte "Problem" gekommen bin.
Delphi-Quellcode:
PMyRec = ^TMyRec<Typ: record>; // <<< geht natürlich nicht
// aber das war ja klar
TMyRec<Typ: Record> = record
type PTyp = ^Typ; // <<< geht
{...}
end;
Allerdings geht auch das nicht, obwohl hier Typ ja bekannt wäre.
Delphi-Quellcode:
TMyRec<Typ: record> = record
type PMyRec = ^TMyRec<Typ>; // <<< geht nicht
PTyp = ^Typ; // <<< geht
{...}
end;
Wie soll man da einen Pointer deklarieren, welchen auch der generische Teil kennt?
OK, außer man macht es umständlicher extern,
welches aber nicht unbedingt eine "fehlerunanfälligere" Deklaration erfordert.
Delphi-Quellcode:
TMyRec<Typ: record; PRec> = record
type PMyRec = PRec;
PTyp = ^Typ;
{...}
end;
PTest = ^TTest;
TTest = TMyRec<Integer, PTest>;
Und da Records keine Vererbung kennen, kann man hier ja keinen genaueren Typen festlegen, welcher dann ein "Value" kennt:
Delphi-Quellcode:
TMyRec<Typ: record> = record
x: Typ;
function Test: Integer;
end;
function TMyRec<Typ>.Test: Integer;
begin
Result := X.Value; // <<< geht nicht
end;
Selbst wenn sichergestellt ist, daß der Record "Typ" einen Wert "Value" besietzt, geht dieses nicht,
da der Compiler dennoch meckert, daß "Value" nicht bekannt sei.
[add]
Und Generics für Helper gehn leider auch nicht.
Delphi-Quellcode:
TMyRec<Typ: Record> = Record Helper for Typ
...
end;
TMyCls<Typ: Class> = Class Helper for Typ
...
end;