Classe itérateur

De Wiki1000
Révision datée du 10 février 2012 à 09:08 par Syfre (discussion | contributions) (Page créée avec « Une classe métier utilisée comme itérateur dans une instruction ForEach doit supportée une interface technique d'itération. Cette interface est défini par le support d… »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Une classe métier utilisée comme itérateur dans une instruction ForEach doit supportée une interface technique d'itération.

Cette interface est défini par le support des quatres méthodes suivantes :

Open procedure Open(iMode:TEnumeratorMode);
MoveNext function MoveNext:boolean;
GetCurrent procedure GetCurrent(var Dest:variant);
GetIndex function GetIndex:Integer;
Tip : Le support de l'interface est testé à l'exécution et pas à la compilation

Exemple:

Dans cet exemple la classe ProcessusB supporte l'interface itérateur :

<source lang="delphi">

Type

 ProcessusB = class
  fCursor : Cursor;
  fIndex: Integer;
  //IscrEnumerator
  procedure Open(iMode:TEnumeratorMode);
  function MoveNext:boolean;
  procedure GetCurrent(var Dest:variant);
  function GetIndex:Integer;
 end;

procedure ProcessusB.Open(iMode:TEnumeratorMode); begin

fIndex := -1;

end;

function ProcessusB.MoveNext:boolean; begin

 if fIndex=-1 then
   begin
     fCursor.ClassName := 'ClassC';
     fCursor.Open;
   end
   else fCursor.Next;
Result := not fCursor.Eoi;
 if not Result
    then fCursor.Close
    else fIndex := fIndex+1;

end;

procedure ProcessusB.GetCurrent(var Dest:variant); begin

 Dest := fCursor.Instance;

end;

function ProcessusB.GetIndex:Integer; begin

 Result := fIndex;

end; </source>

Ce processus est utilisé par un autre processus comme itérateur :

<source lang="delphi"> Type

 ProcessusA = class
   procedure doProcess(inst:ClassC);
   function TestForEach:Integer;
 end;

procedure ProcessusA.doProcess(inst:ClassC); begin

 withP transaction do
   begin
     inst.unEntierC := inst.unEntierC+1;
   end;

end;

function ProcessusA.TestForEach:Integer; var iterator:ProcessusB; inst:ClassC; count:Integer; begin

iterator := ProcessusB.Create;
foreach inst in iterator index count do
 begin
   doProcess(inst);
 end;
Result := 1+count;

end; </source>