« 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
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 ==
|