В предыдущих темах мы разобрали некоторые основные встроенные коллекции и посмотрели, как их использовать. Однако мы не ограничены только этими классами коллекций, и можем создавать свои собственные коллекции или хранилища объектов. Наиболее простым способом создания хранилища объектов является использование индексаторов.
Индексаторы представляют специальные свойства, которые позволяют индексировать объекты и использовать их как массивы. По форме они
напоминают свойства со стандартными методами get и set, которые возвращают и присваивают значение.
Посмотрим на примере. Допустим, у нас есть класс Book, представляющий книгу, и класс Library, который используется для хранения набора книг и использует индексаторы:
Module Module1
Sub Main()
Dim library As New Library()
Console.WriteLine(library(0).Name)
library(0) = New Book("Преступление и наказание")
Console.WriteLine(library(0).Name)
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
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
End Class
End Module
В классе Library определен массив объектов Book, к которому затем будем обращаться с помощью индексатора. А само определение индексатора
напоминает свойство: Default Public Property Item(index As Integer) As Book.
Во-первых, для определения индексатора используется ключевое слово Default. Во-вторых, в качестве возвращаемого
или присваиваемого объекта указывается тип Book - тип объектов в хранилище.
И в-третьих, в определении свойства указывается параметр index As Integer, через который будет осуществляться доступ к конкретным элементам.
И теперь мы сможем обращаться к объекту Library как к массиву: library(0).Name. Так как индексатор использует
тип Book, то library(0) будет представлять объект Book.
Посмотрим более сложный пример. Допустим, у нас есть класс, в котором хранилище определено в виде двухмерного массива или матрицы:
Class Matrix
Dim numbers As Integer(,) = {{1, 2, 4}, {2, 3, 6}, {3, 4, 8}}
Default Public Property Item(i As Integer, j As Integer) As Integer
Get
Return numbers(i, j)
End Get
Set(value As Integer)
numbers(i, j) = value
End Set
End Property
End Class
В отличие от первого примера здесь для определения индексатора используются сразу два индекса - i и j. Соответственно в программе мы уже должны обращаться к объекту, используя два индекса:
Dim matrix As New Matrix() Console.WriteLine(matrix(0, 0)) matrix(0, 0) = 111 Console.WriteLine(matrix(0, 0))