Arrays
können mit benutzerdefinierten Aufzählungstypen indiziert werden. Zum Beispiel:
type
TIndexValue = (ZERO = 0, ONE, TWO, THREE, FOUR);
var
MyArray: array[Low(TIndexValue) .. High(TIndexValue)] of String;
Auf die Elemente dieses Arrays kann dann mit TIndexValue
Werte als Index:
MyArray[ZERO] := 'abc';
Ich versuche, dasselbe zu erreichen allgemein Funktionalität mit einer TStringList
.
Eine einfache Lösung besteht darin, jeden Indexwert in eine Integer
Typ zum Zeitpunkt der Bezugnahme:
MyStringList[Integer(ZERO)] := 'abc';
Eine andere Lösung (um das ganze Casting auszublenden) ist die Erstellung einer Unterklasse von TStringList
und verschieben das Casting auf die Unterprogramme dieser Unterklasse, die auf die geerbten Strings
Eigentum:
type
TIndexValue = (ZERO = 0, ONE, TWO, THREE, FOUR);
type
TEIStringList = class(TStringList)
private
function GetString(ItemIndex: TIndexValue): String;
procedure SetString(ItemIndex: TIndexValue; ItemValue: String);
public
property Strings[ItemIndex: TIndexValue]: String
read GetString write SetString; default;
end;
function TEIStringList.GetString(ItemIndex: TIndexValue): String;
begin
Result := inherited Strings[Integer(ItemIndex)];
end;
procedure TEIStringList.SetString(ItemIndex: TIndexValue; ItemValue: String);
begin
inherited Strings[Integer(ItemIndex)] := ItemValue;
end;
Dies funktioniert gut bei einer einzigen Implementierung, die den Aufzählungstyp TIndexValue
.
Ich möchte jedoch dieselbe Logik oder Unterklasse für mehrere verschiedene Anwendungen wiederverwenden. TStringList
Objekte, die durch verschiedene Aufzählungstypen indiziert sind, ohne dass sie TStringList
Unterklassen für jeden möglichen Aufzählungstyp.
Ist so etwas möglich? Ich vermute, ich kann auf Delphi's Generics abhängen, aber ich würde sehr daran interessiert sein, zu erfahren, dass es einfachere Möglichkeiten, dies zu erreichen.