« Classe itérateur » : différence entre les versions

De Wiki1000
Aucun résumé des modifications
m (Remplacement du texte — « category:Tahoe » par « Category:Version650 »)
 
(3 versions intermédiaires par le même utilisateur non affichées)
Ligne 5 : Ligne 5 :
{|class="wikitable"
{|class="wikitable"
|-
|-
|[[Open (IscrEnumerator)|Open]]
|[[iteOpen (IscrEnumerator)|iteOpen]]
|procedure Open(iMode:TEnumeratorMode);
|procedure iteOpen;
|-
|-
|[[MoveNext (IscrEnumerator)|MoveNext]]
|[[iteMoveNext (IscrEnumerator)|iteMoveNext]]
|function MoveNext:boolean;
|function iteMoveNext:boolean;
|-
|-
|[[GetCurrent (IscrEnumerator)|GetCurrent]]
|[[iteGetCurrent (IscrEnumerator)|iteGetCurrent]]
|procedure GetCurrent(var Dest:variant);
|procedure iteGetCurrent(var Dest:variant);
|-
|-
|[[GetIndex (IscrEnumerator)|GetIndex]]
|[[iteGetIndex (IscrEnumerator)|iteGetIndex]]
|function GetIndex:Integer;
|function iteGetIndex:Integer;
|}
|}


Ligne 31 : Ligne 31 :
   fIndex: Integer;
   fIndex: Integer;
   //IscrEnumerator
   //IscrEnumerator
   procedure Open(iMode:TEnumeratorMode);
   procedure iteOpen;
   function MoveNext:boolean;
   function iteMoveNext:boolean;
   procedure GetCurrent(var Dest:variant);
   procedure iteGetCurrent(var Dest:variant);
   function GetIndex:Integer;
   function iteGetIndex:Integer;
   end;
   end;


procedure ProcessusB.Open(iMode:TEnumeratorMode);
procedure ProcessusB.iteOpen;
begin
begin
  fIndex := -1;
  fIndex := -1;
end;
end;


function ProcessusB.MoveNext:boolean;
function ProcessusB.iteMoveNext:boolean;
begin
begin
   if fIndex=-1 then
   if fIndex=-1 then
Ligne 56 : Ligne 56 :
end;
end;


procedure ProcessusB.GetCurrent(var Dest:variant);
procedure ProcessusB.iteGetCurrent(var Dest:variant);
begin
begin
   Dest := fCursor.Instance;
   Dest := fCursor.Instance;
end;
end;


function ProcessusB.GetIndex:Integer;
function ProcessusB.iteGetIndex:Integer;
begin
begin
   Result := fIndex;
   Result := fIndex;
Ligne 95 : Ligne 95 :
end;
end;
</source>
</source>


[[category:Objets itérateurs]]
[[category:Objets itérateurs]]
[[category:Tahoe]]
[[category:Interface itération]]
[[Category:Version650]]

Dernière version du 9 avril 2013 à 09:19

Une classe métier peut être utilisée comme itérateur dans une instruction ForEach à condition de supporter une interface technique d'itération.

Cette interface est définie par les quatre méthodes suivantes :

iteOpen procedure iteOpen;
iteMoveNext function iteMoveNext:boolean;
iteGetCurrent procedure iteGetCurrent(var Dest:variant);
iteGetIndex function iteGetIndex: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 iteOpen;
  function iteMoveNext:boolean;
  procedure iteGetCurrent(var Dest:variant);
  function iteGetIndex:Integer;
 end;

procedure ProcessusB.iteOpen; begin

fIndex := -1;

end;

function ProcessusB.iteMoveNext: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.iteGetCurrent(var Dest:variant); begin

 Dest := fCursor.Instance;

end;

function ProcessusB.iteGetIndex: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>