Основой для большинства встроенных коллекций является реализация интерфейсов IEnumerable и IEnumerator, которые определяют базовый функционал
коллекций. Благодаря реализации этих интерфейсов мы можем перебирать объекты коллекции в цикле foreach
.
Интерфейс IEnumerable имеет метод, возвращающий ссылку на другой интерфейс - перечислитель:
Public Interface IEnumerable GetEnumerator() As IEnumerator End Interface
А интерфейс IEnumerator определяет функционал для перебора внутренних объектов в контейнере:
Public Interface IEnumerator Function MoveNext() As Boolean 'перемещение на одну позицию вперед в контейнере элементов ReadOnly Property Current() As Object 'текущий элемент в контейнере Sub Reset() 'перемещение в начало контейнера End Interface
Возьмем пример с классом Library из прошлой темы и реализуем в этом классе интерфейс IEnumerable:
Module Module1 Sub Main() Dim library As New Library() For Each b As Book In library Console.WriteLine(b.Name) Next Console.ReadLine() End Sub Class Book Public Property Name() As String Sub New(name As String) Me.Name = name End Sub End Class Class Library Implements IEnumerable Dim books As Book() Sub New() books = New Book() {New Book("Отцы и дети"), New Book("Война и мир"), New Book("Евгений Онегин")} End Sub Public ReadOnly Property Length As Integer Get Return books.Length End Get End Property Default Public Property Item(index As Integer) As Book Get Return books(index) End Get Set(value As Book) books(index) = value End Set End Property 'возвращаем перечислитель Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return books.GetEnumerator() End Function End Class End Module
Таким образом, благодаря реализации IEnumerable мы сможем пройтись по объекту Library в цикле for each, как по контейнеру элементов.