150 likes | 311 Views
Iterator Pattern. Dr. Neal CIS 480. Iterator. An iterator pattern can be used when one class is a collection of things and would like to provide a standardized method of accessing it’s collection to another class.
E N D
Iterator Pattern Dr. Neal CIS 480
Iterator • An iterator pattern can be used when one class is a collection of things and would like to provide a standardized method of accessing it’s collection to another class. • In Microsoft’s C# the .NET framework defines two interfaces for solving the iterator problem.
Microsoft C# Interfaces • IEnumerable • Defines a method GetEnumerator() which return a class of type IEnumerator • IEnumerator • Defines methods for MoveNext() and ReSet() which allow sequential movement through the collection or reset to the beginning • Defines an attribute/property Current that contains the current object in the collection
Iterator Pattern Example • Say we have a Shopping Cart of some items, call this class “Cart”. This class must implement the “IEnumerable” interface. • We will create a class called “EnumCart” which is the iterator for “Cart”. This class must implement the “IEnumerator” interface. • Finally, we will create a Form to display our results using a C# foreach statement to test our iterator.
Example User Interface • Our user interface will just display the items in Cart when the DumpCart button is pushed.
public class Cart : IEnumerable { string[] cart; int length; public Cart() { length = 4; cart = new string[length]; cart[0] = "Item one"; cart[1] = "Item two"; cart[2] = "Item three"; cart[3] = "Item four"; } #region IEnumerable Members // this method returns a object which implements the // the IEnumerator interface so that it can be used // in an enumeration public IEnumerator GetEnumerator() { return new EnumCart(cart); } #endregion } Cart Class Implemention of IEnumerable Interface
public class EnumCart : IEnumerator { object[] list; int count; public EnumCart(object[] ol) { list = ol; count = -1; } #region IEnumerator Members public void Reset() { count = -1; } public object Current { get { return list[count]; } } public bool MoveNext() { count++; if (count < list.Length) return true; else return false; } EnumCart Class Implemention of IEnumerator Interface
Event Procedure in Form private void dumpCartClick(object sender, System.EventArgs e) { Cart c = new Cart(); foreach(string s in c) { lblResults.Text = lblResults.Text + s + "\n"; } } Use foreach to iterate through the Cart
The Magic of Objects and Compilers • Note that in our implementation no code never references the class “EnumCart” or calls the GetEnumerator() method in “Cart” • Let’s look behind the scenes and determine what the compiler is doing to our code.
A foreach Enumeration in C# Cart c = new Cart(); foreach (string s in c) { lblResults.Text = lblResults.Text + s + "\n"; } Programmer Created Code Cart c = new Cart(); IEnumerator e = c.GetEnumerator(); while (e.MoveNext()) { string s = (string) e.Current; lblResults.Text = lblResults.Text + s + "\n"; } C# Compiler Generated Code