Programmierkurs C-Sharp: Iterator

Aus Wikibooks

Wechseln zu: Navigation, Suche
Wikitext.svg Dieser Buchabschnitt benötigt eine Wikifizierung. Hilfe ist erwünscht! Textbezogenen Fragen und Anmerkungen können auf der Diskussionsseite besprochen werden.

[Bearbeiten] Implementierung


Crystal Clear app terminal.png C#-Code:  

 using System;
 using System.Collections;
 
 namespace Org.Wikibooks.De.Csharp.Pattern.Iterator
 {
 
  #region Implementierung des Design Patterns Iterator
  #region Beschreibung
  /*
   * Im folgenden Abschnitt befindet sich die Implementierung
   * des Iterator-Patterns, wie es in Wikibooks (Muster) definiert ist.
   * 
   * Um die Komplexität zu senken,
   * wurde das Muster minimal modifiziert.
   *
   */
  #endregion
 
  // Die Klasse Iterator birgt die abstrakte Implementierung
  // aller für die Traversierung benötigten Funktionen.
  abstract class Iterator
  {
    public abstract void Start();
 
    public abstract object GibElement();
 
    // Modifikation: 
    // Das Wikibook-Pattern "Iterator" verlangt hier eine Methode 
    // ohne Rückgabe. Jedoch ist die Implementierung
    // einfacher, wenn wir gleich das nächste Element
    // zurückgeben können.
    public abstract object Weiter();
 
    // Infolge der Modifikation wird diese Methode überflüssig.
    // Sie ist lediglich der Vollständigkeit halber implementiert.
    public abstract bool GibtWeiteres();
  }
 
  abstract class Sammlung
  {
    public abstract Iterator ErzeugeIterator();
  }
 
  class KonkreterIterator : Iterator
  {
    private KonkreteSammlung m_Sammlung;
 
    // Der Zeiger auf das 
    // aktuelle Objekt der Sammlung.
    private int m_Aktuell = 1;
 
    public KonkreterIterator(KonkreteSammlung sammlung)
    {
      m_Sammlung = sammlung;
    }
 
    public override void Start()
    {
      m_Aktuell = 1;
    }
 
    public override object GibElement()
    {
      return m_Sammlung[m_Aktuell - 1];
    }
 
    public override object Weiter()
    {
      object element = null;
 
      // Falls sich noch weitere Elemente
      // in der Sammlung befinden,
      // iterieren wir den aktuellen Positionszeiger.
      if (m_Sammlung.Anzahl > m_Aktuell)
      {
      m_Aktuell++;
      element = GibElement();
      }
      return element;
    }
 
    // Diese Methode ist in der aktuellen Implementierung
    // funktionslos und wurde nur der Vollständigkeit halber aufgenommen.
    public override bool GibtWeiteres()
    {
      return ((m_Aktuell < m_Sammlung.Anzahl) ? true : false);
    }
  }
 
  class KonkreteSammlung : Sammlung
  {
    private ArrayList m_Liste = new ArrayList();
 
    public override Iterator ErzeugeIterator()
    {
      return new KonkreterIterator(this);
    }
 
    public int Anzahl
    {
      get { return m_Liste.Count; }
    }
 
    public object this[int index]
    {
       get { return m_Liste[index]; }
       set { m_Liste.Insert(index, value); }
    }
  }
  #endregion

Die Verwendung des Iterators:


Crystal Clear app terminal.png C#-Code:  

  #region Verwendung des Iterators
  public class Consumer
  {
    private KonkreteSammlung m_Sammlung;
 
    public Consumer()
    {
      // Hier erzeugen wir die Sammlung
      m_Sammlung = new KonkreteSammlung();
 
      // Wir füllen die Sammlung mit Objekten.
      m_Sammlung[0] = "1. Objekt";
      m_Sammlung[1] = "2. Objekt";
      m_Sammlung[2] = "3. Objekt";
      m_Sammlung[3] = "4. Objekt";
    }
 
    public void Iteriere()
    {
      KonkreterIterator iterator = new KonkreterIterator(m_Sammlung);
 
      Console.WriteLine("Beginne Iteration über {0} Objekte:\n", m_Sammlung.Anzahl);
 
      // Wir setzen den Iterator auf das erste
      // Element in der Sammlung.
      iterator.Start();
      object element = iterator.GibElement();
 
      while (element != null)
      {
        Console.WriteLine(element);
        element = iterator.Weiter();
      }
 
      Console.ReadLine();
    }
  }
  #endregion
 }

Ausgabe:


Crystal Clear app kscreensaver.png Output:  

Beginne Iteration über 4 Objekte:

1. Objekt
2. Objekt
3. Objekt
4. Objekt

[Bearbeiten] Quellen

Wikibooks: Definition des Design Patterns: Iterator
Wikipedia: Iteration, Iterator, Iterator (Entwurfsmuster)

Go-up.svg Hoch zum Inhaltsverzeichnis
Persönliche Werkzeuge