Interessant!
Ich würde das mit dem
Dekorator Design-Pattern lösen.
Dazu leitet man von TStrings ab und muss dann natürlich alle virtuellen (und abstrakten) Methoden überschreiben.
Dabei leitet man die Methoden nur auf das TStrings-Objekt weiter, dass im Konstruktor übergeben wurde.
Delphi-Quellcode:
TSlicedStrings = class(TStrings)
private
FStrings : TStrings;
function GetSlice(const Range: string): TStrings;
//procedure SetStrings(Slice: string; const Value: TStrings);
public
constructor Create(AStrings:TStrings);
function Add(const S: string): Integer; override;
property Slice[const Range: string]: TStrings read GetStrings;
property Slice[fromIdx,toIdx:Integer]:TStrings; // 2. Variante
end;
constructor TSlicedStrings.Create(AStrings:TStrings);
begin
inherited Create;
FStrings := AStrings;
end;
function TSlicedStrings.Add(const S: string): Integer; override;
begin
Result := FStrings.Add(S); // einfach auf internes Objekt umleiten
end;
function TSlicedStrings.GetSlice(const Range: string): TStrings;
var
i,j : Integer;
begin
Result := TStringList.Create;
case Pos(':', Range) of
0:
begin
j := StrToInt(Range);
Result.AddObject(Strings[j], Objects[j]);
end
else begin
for i in GetIntArrayFromSlice(Range, Count - 1) do
Result.AddObject(Strings[i], Objects[i]);
end;
end;
end;