next up previous contents index
Weiter: 12.4 Ein allgemeines Hinauf: 12 Objektorientierte Konzepte Zurück: 12.2 Mehrfache Implementationen

12.3 Iteratoren

 

Eine der grundlegenden Operationen in der objektorientierten Programmierung ist es, eine Operation auf eine Menge von unterschiedlichen Elementen einer Menge anzuwenden. Die Elemente müssen dazu nur einen gemeinsamen Vatertyp haben und besagte Operation muß diesem Vatertyp bekannt sein.

Als Beispiel betrachten wir:

type Element is ...

package Sets is
type Set is limited private;
-mehrereOperationendesTypsSet

type Iterator is abstract tagged null record;
procedure Iterate(S: Set; IC: Iterator'CLASS);
procedure Action(
E: in out Element;
I: in out Iterator) is abstract;
private
type Node;
type Ptr is access Node;
type Node is
record
E: Element;
Next: Ptr;
end record;
type Set is new Ptr;
end Sets;

package body Sets is
-BodiesderSet-Operationen

procedure Iterate(S: Set; IC: Iterator'CLASS) is
This: Ptr := Ptr(S);
begin
while This null loop
Action(This.E, IC); -dispatch
This := This.Next;
end loop;
end Iterate;

end Sets;

Wir haben also einen abstrakten Typ Iterator mit einer primitiven Operation Action eingeführt. Die Prozedur Iterate vollführt eine Schleife über die ganze Menge und ruft unter Verwendung des Dispatching-Mechanismus die Prozedur Action auf, die zu den Typen der einzelnen Mengenelementen gehört.

Eine einfache Anwendung dieses Iterators, nämlich das Zählen der Elemente einer Menge könnte wie folgt aussehen.

package Sets.Stuff is
function Count(S: Set) return Natural;
end Sets.Stuff;

package body Sets.Stuff is

type Count_Iterator is new Iterator with
record
Result: Natural := 0;
end record;

procedure Action(
E: in out Element;
I: in out Count_Iterator) is
begin
I. Result := I.Result + 1;
end Action;

function Count(S: Set) return Natural is
I: Count_Iterator;
begin
Iterate(S, I);
return I.Result;
end Count;
end Sets.Stuff;



Johann Blieberger
Wed Feb 11 09:58:52 MET 1998