type
TCounterEnumerator = class
private
FCurrent, FHigh, FStep: Integer;
public
constructor Create(
ALow, AHigh, AStep: Integer);
function MoveNext: Boolean;
property Current: Integer read FCurrent;
end;
TCounter = class
private
FLow, FHigh, FStep: Integer;
public
constructor Create(
ALow, AHigh, AStep: Integer);
function GetEnumerator: TCounterEnumerator;
end;
constructor TCounterEnumerator.Create(
ALow, AHigh, AStep: Integer);
begin
FCurrent := ALow - AStep;
FHigh := AHigh;
FStep := AStep;
end;
function TCounterEnumerator.MoveNext: Boolean;
begin
FCurrent := FCurrent + FStep;
Result := FCurrent <= FHigh;
end;
constructor TCounter.Create(
ALow, AHigh, AStep: Integer);
begin
FLow := ALow;
FHigh := AHigh;
FStep := AStep;
end;
function TCounter.GetEnumerator:
TCounterEnumerator;
begin
Result := TCounterEnumerator.Create(
FLow, FHigh, FStep);
end;
var
C: Integer;
begin
//for-in works with any class that
//provides GetEnumerator with
//MoveNext and Current
for C in TCounter.Create(3, 9, 2) do
WriteLn(C);
//printed 3, 5, 7, 9
end.