« Classe itérateur » : différence entre les versions
(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… ») |
Aucun résumé des modifications |
||
Ligne 1 : | Ligne 1 : | ||
Une classe métier utilisée comme itérateur dans une instruction ForEach | 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 | Cette interface est définie par les quatre méthodes suivantes : | ||
{|class="wikitable" | {|class="wikitable" |
Version du 10 février 2012 à 09:09
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 :
Open | procedure Open(iMode:TEnumeratorMode); |
MoveNext | function MoveNext:boolean; |
GetCurrent | procedure GetCurrent(var Dest:variant); |
GetIndex | function GetIndex:Integer; |
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>