示例:内部迭代器(依赖于子类) 说明: 下面是第二种实现办法的一个大体框架,它利用了子类生成。这里我们称内部迭代器为一个ListTraverser。 ListTraverser以一个List实例为参数。在内部,它使用一个外部ListIterator进行遍历。Traverse启动遍历并对每一元素项调用ProcessItem操作。内部迭代器可在某次ProcessItem操作返回false时提前终止本次遍历。而Traverse返回一个布尔值指示本次遍历是否提前终止。 代码: unit uListTraverser; interface uses uList,uListIterator; type TListTraverser = class private FIterator: TListIterator; protected function ProcessItem(AItem: TObject): Boolean; virtual;abstract; public constructor Create(AList: TList1); destructor Destroy; override; //--- function Traverse(): Boolean; end; implementation { TListTraverser } constructor TListTraverser.Create(AList: TList1); begin FIterator := TListIterator.Create(AList); end; destructor TListTraverser.Destroy; begin FIterator.Free; //--- inherited; end; function TListTraverser.Traverse: Boolean; begin Result := false; //--- with FIterator do begin First; while not IsDone do begin Result := self.ProcessItem(CurrentItem); if not Result then Break; //--- Next; end; end; end; end. unit uPrintNEmployees; interface uses uList,uListTraverser; type TPrintNEmployees = class(TListTraverser) private FTotal: integer; FCount: integer; protected function ProcessItem(AItem: TObject): Boolean; override; public constructor Create(AList: TList1;n:integer); end; implementation uses uEmployee; constructor TPrintNEmployees.Create(AList: TList1; n: integer); begin inherited Create(AList); //--- FTotal := n; FCount := 0; end; function TPrintNEmployees.ProcessItem(AItem: TObject): Boolean; begin FCount := FCount + 1; TEmployee(AItem).Print; Result := FCount < FTotal; end; end. procedure TForm1.Button5Click(Sender: TObject); //---使用内部迭代器 procedure _Test1; var AEmployees: TList1; pa: TPrintNEmployees; i: integer; begin self.Memo1.Clear; //--- AEmployees := TList1.Create; try with AEmployees do begin for i := 1 to 15 do Add(TEmployee.Create(IntToStr(i),self.Memo1)); end; //--- pa := TPrintNEmployees.Create(AEmployees,10); pa.Traverse; pa.Free; finally AEmployees.Free; end; end; //---使用外部迭代器 procedure _Test2; var AEmployees: TList1; AIterator: TListIterator; i,ACount: integer; begin self.Memo1.Clear; //--- AEmployees := TList1.Create; try with AEmployees do begin for i := 1 to 15 do Add(TEmployee.Create(IntToStr(i),self.Memo1)); end; //--- AIterator := TListIterator.Create(AEmployees); try with AIterator do begin ACount := 0; //--- First; while not IsDone do begin inc(ACount); TEmployee(CurrentItem).Print; if ACount >= 10 then Break; //--- Next; end; end; finally AIterator.Free; end; finally AEmployees.Free; end; end; begin _Test2; end;
