« Patrons de conception/Itérateur » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 21 :
La possibilité pour un conteneur de se voir modifié pendant une itération s'est imposée comme nécessaire dans la [[programmation objet]] moderne, où les relations entre objets et l'effet de certaines opérations peut devenir un casse-tête. En utilisant un tel itérateur « robuste », ces désagréments nous sont épargnés.
 
== Utilisation d'un itérateursitérateur explicite ==
 
Dans un langage à objets comme le C#, un itérateur est un objet qui implémente l'interface IEnumerator
 
<source lang=csharp>
interface IEnumerator {
{
void Reset();
bool MoveNext();
Ligne 33 ⟶ 32 :
}
</source>
 
Une implémentation typique pourra être la suivante
 
<source lang=csharp>
class IterateurDeStringTypique : IEnumerator {
 
private string[] _chainesAParcourir = new string[] { "TF1", "France2", "FR3", "Canal+" };
private int _positionCourante;
 
public void Reset() {
_positionCourante = -1;
}
public bool MoveNext() {
if( _positionCourante +1 >= _chainesAParcourir.Length )
return false;
 
_positionCourante +=1;
return true;
}
public void object Current {
get { _chainesAParcourir[_positionCourante]; }
}
}
</source>
 
On utilisera alors l'iterateur ainsi pour afficher les valeurs disponibles
 
<source lang=csharp>
IterateurDeStringTypique iterateur = new IterateurDeStringTypique();
iterateur.Reset();
while(iterateur.MoveNext()){
Console.WriteLine(iterateur.Current.ToString());
}
</source>
 
Grace à l'interface IEnumerable, on peut passer à un itérateur implicite.
 
<source lang=csharp>
interface IEnumerable {
IEnumerator GetEnumerator();
}
</source>
 
Un type dérivé de IEnumerable comme le sont les tableaux, listes, dictionnaires en C# possède une méthode GetEnumerator() qui appelle l'itérateur explicite. C'est cette méthode GetEnumerator qui est appelée par l'instruction foreach du C#, de manière à obtenir l'objet Current directement à chaque itération.
 
== Itérateurs implicites ==