数组和集合 / 迭代器

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.MoveNextBoolean;
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(392do
    WriteLn(C);
  //printed 3, 5, 7, 9
end.