Индексаторы и создание коллекций

Последнее обновление: 30.10.2015

В предыдущих темах мы разобрали некоторые основные встроенные коллекции и посмотрели, как их использовать. Однако мы не ограничены только этими классами коллекций, и можем создавать свои собственные коллекции или хранилища объектов. Наиболее простым способом создания хранилища объектов является использование индексаторов.

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