Pascal 7 & Objects

       

Итератор ForEach


-----------------------------------------------------------------

ForEach воспринимает указатель на процедуру. Процедура имеет один параметр, который является указателем на хранимый в наборе элемент. Для каждого элемента набора ForEach вызывает процедуру один раз, в той последовательности, в которой элементы появляются в наборе. Процедура PrintAll в Collect1 показывает пример итера- тора FoeEach.

procedure PrintAll(C: PCollection); procedure CallPrint(P: PClient); far; begin P^.Print; {Вызов метода Print} end; begin {Print} Writeln; Writeln; Writeln('Client list:'); C^.ForEach(@CallPrint); { распечатка для каждого клиента } end;

Для каждого элемента набора, переданного в качестве парамет- ра в PrintAll, вызывается вложенная процедура CallPrint. CallPrint просто распечатывает информацию об объекте клиента в отформатированных колонках.

Примечание: Итераторы должны вызывать локальные проце- дуры far.

Вам нужно быть аккуратным с сортировкой процедур, которые вы вызываете итераторами. Для того, чтобы быть вызванной итератором, процедура (в данном примере, CallPrint) должна:

* Быть процедурой - она не может быть функцией или методом объекта, хотя данный пример показывает, что процедура мо- жет вызвать метод.

* Быть локальной (вложенной) относительно вызывающей ее прог- раммы.

* Описываться как дальняя процедура директивой far или ди- рективой компилятора {$F+}.

* Воспринимать указатель на элемент набора в качестве своего единственного параметра.



Содержание раздела