Arrays
может быть проиндексировано с использованием пользовательских перечислимых типов.Например:
type
TIndexValue = (ZERO = 0, ONE, TWO, THREE, FOUR);
var
MyArray: array[Low(TIndexValue) .. High(TIndexValue)] of String;
На элементы этого массива можно ссылаться, используя в качестве индекса значения TIndexValue
:
MyArray[ZERO] := 'abc';
Я пытаюсь получить то же самое general функциональность с TStringList
.
Одно простое решение - привести каждое значение индекса к типу Integer
во время ссылки:
MyStringList[Integer(ZERO)] := 'abc';
Другое решение (скрытьвсе приведения) заключается в создании подкласса TStringList
и отложении всех приведений к подпрограммам этого подкласса, которые обращаются к унаследованному свойству Strings
:
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;
Это прекрасно работает для одной реализации, которая используетперечислимый тип TIndexValue
.
Однако я хотел бы повторно использовать одну и ту же логику или подкласс для нескольких различных TStringList
объектов, которые проиндексированы различными перечисляемыми типами, без необходимости определять TStringList
подклассы для каждого возможного перечисляемого типа.
Возможно ли что-то подобное?Я подозреваю, что мне, возможно, придется зависеть от Generics Delphi, но мне было бы очень интересно узнать, что есть более простые способы достичь этого.