Ich versuche mich grade an Generics. Da ich viel mit Enums arbeite, habe ich versucht diese beiden Dinge zu kombinieren. Als TypeParameter möchte ich also ein Enum angeben. Das kann ich hervorragend definieren, aber ich kann in einer Funktion diese Parameter nicht auswerten.
Hier mal ein Beispielcode:
Delphi-Quellcode:
unit genericstest;
interface
type
TblubItems1 = (ti1a, ti1b, ti1c, ti1d, ti1f);
TblubItems2 = (ti2a, ti2b, ti2c, ti2d, ti2f, ti2g);
type
TGenericstest<TBlubItems> =
class(TObject)
public
function count:integer;
function IndexFromItem(aItem:TBlubItems):integer;
end;
TGenericstestBlub1 =
class(TGenericstest<TblubItems1>);
TGenericstestBlub2 =
class(TGenericstest<TblubItems2>);
implementation
{ TGenericstest<TBlubItems> }
function TGenericstest<TBlubItems>.count: integer;
begin
// Was hier rein setzen, um die Anzahl der Items im Aufzählungstyp zu ermitteln
// Bei TblubItems1 muss das Ergebnis 5 sein.
// Bei TblubItems2 muss das Ergebnis 6 sein.
end;
function TGenericstest<TBlubItems>.IndexFromItem(aItem: TBlubItems): integer;
begin
// Was hier rein setzen, um den Index eines Items im Aufzählungstyp zu ermitteln.
// Bei aItem = ti1a muss das Ergebnis 0 sein.
// Bei aItem = ti2c muss das Ergebnis 2 sein.
end;
end.
Ich kann diese Objekte Erzeugen und anwenden.
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
lGenericstestBlub1 : TGenericstestBlub1;
lGenericstestBlub2 : TGenericstestBlub2;
begin
lGenericstestBlub1 := TGenericstestBlub1.create;
lGenericstestBlub2 := TGenericstestBlub2.create;
ListBox1.items.add(inttostr(lGenericstestBlub1.IndexFromItem(ti1a)));
ListBox1.items.add(inttostr(lGenericstestBlub2.IndexFromItem(ti2b)));
lGenericstestBlub1.free;
lGenericstestBlub2.Free;
end;
Aber was nützt mir das, wenn ich in der Funktion IndexFromItem oder Count den übergebenen Typen nicht auswerten kann.
Ich habe schon in einem
anderen Beitrag gesehen, das Generics und Enums nicht wirklich zusammen passen sollen. Aber der Beitrag ist von 2010. Vieleicht hat sich ja im Sprachumfang noch etwas geändert.