統一存取不同內部結構的集合,避免客戶代碼耦合具體實作 (List、Hashtable 等)。
interface ICollection { int Count { get; } Iterator GetIterator(); }
interface Iterator { bool MoveNext(); object Current { get; } }
class List : ICollection { /* 陣列儲存 */ public Iterator GetIterator() => new ListIterator(this); }
class ListIterator : Iterator { /* 索引遍歷邏輯 */ }
static void Main()
{
ICollection list = new List();
Iterator it = list.GetIterator();
while (it.MoveNext()) { object current = it.Current; /* ... */ }
}
IEnumerable:單一方法 GetEnumerator() 回傳 IEnumerator。IEnumerator:MoveNext()、Current、Reset()。IEnumerable,故支援 foreach。foreach 編譯器擴展
// 原始碼
foreach (object item in list) Console.WriteLine(item);
// 編譯器展開 (簡化)
IEnumerator e = list.GetEnumerator();
try { while (e.MoveNext()) { object item = e.Current; Console.WriteLine(item); } }
finally { (e as IDisposable)?.Dispose(); }
理解此機制有助於正確實作自訂集合與診斷列舉器相關 Bug。