ich hab ein Konstrukt, mit dem ich ein Objekt kapsele, um daraus ein Interface zu machen. Das Interface stellt dann eine Art ForEach-Methode für Daten des Objekts zur Verfügung
Wäre das nicht eher etwas für einen Enumerator?
Delphi-Quellcode:
type
TMyObject = class
private type
TEnumerator = record
private
FIndex: Integer;
FOwner: TMyObject;
function GetCurrent: string;
public
constructor Create(AOwner: TMyObject);
function MoveNext: Boolean;
property Current: string read GetCurrent;
end;
private
FList: TStringList;
public
constructor Create;
destructor Destroy; override;
function GetEnumerator: TEnumerator;
end;
function TMyObject.GetEnumerator: TEnumerator;
begin
Result := TEnumerator.Create(Self);
end;
constructor TMyObject.TEnumerator.Create(AOwner: TMyObject);
begin
FIndex := -1;
FOwner := AOwner;
end;
function TMyObject.TEnumerator.GetCurrent: string;
begin
Result := FOwner.FList[FIndex];
end;
function TMyObject.TEnumerator.MoveNext: Boolean;
begin
Inc(FIndex);
Result := FIndex < FOwner.FList.Count;
end;
Dann kannst du die übliche for-in Syntax verwenden und die Abbruchbedingung direkt einprogrammieren:
Delphi-Quellcode:
var
myObject: TMyObject;
begin
myObject := TMyObject.Create;
try
for var S in myObject do begin
if S = 'Stop' then
Break;
ShowMessage(S);
end;
finally
myObject.Free;
end;
end;