program tw25132; {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} uses uw25132; type TAnotherIterator = class(TIterator) public function GetValue(): Integer; override; end; TCollection = class(TObject) private function CreateAnotherIterator(): TIterator; virtual; function CreateIterator(): TIterator; virtual; end; { TAnotherIterator } function TAnotherIterator.GetValue(): Integer; begin Result := 2; end; { TCollection} function TCollection.CreateAnotherIterator(): TIterator; begin Result := TAnotherIterator.Create(); end; function TCollection.CreateIterator(): TIterator; begin Result := TCollectionIterator.Create(); end; var CollectionIterator: TCollectionIterator; AnotherIterator: TAnotherIterator; begin CollectionIterator := TCollectionIterator.Create(); AnotherIterator := TAnotherIterator.Create(); if CollectionIterator.GetValue() = 1 then WriteLn('Collection iterator: OK') else begin WriteLn('Collection iterator: FAILED'); Halt(1); end; if AnotherIterator.GetValue() = 2 then WriteLn('Another iterator: OK') else begin WriteLn('Another iterator: FAILED'); Halt(1); end; CollectionIterator.Free(); AnotherIterator.Free(); end.