В предыдущих темах мы разобрали некоторые основные встроенные коллекции и посмотрели, как их использовать. Однако мы не ограничены только этими классами коллекций, и можем создавать свои собственные коллекции или хранилища объектов. Наиболее простым способом создания хранилища объектов является использование индексаторов.
Индексаторы представляют специальные свойства, которые позволяют индексировать объекты и использовать их как массивы. По форме они
напоминают свойства со стандартными методами 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))