Вложенные классы. Практическое использование вложенных классов на примере связанного списка.
42 43 ' Вложенный класс для ссылок 44 Friend Class Link 45 Private m_MyData As String 46 Private m_NextLink As Link 47 Friend Sub New(ByVal myParent As Link.ByVal theData As String) 48 m_MyData – theData 49 myParent.m_NextLink = Me 50 ' End Sub 51 Friend Sub New(ByVal theData As String) 52 m_MyData =theData 53 End Sub 54 Friend Readonly Property MyData()As String 55 Get 56 Return m_MyData 57 End Get 58 End Property 59 Friend Readonly Property NextLink()As Link 60 Get 61 Return m_NextLink 62 End Get 63 End Property 64 End Class 65 End Class 66 End Module
Строка 4 создает новый экземпляр связанного списка. В строке 5 определяется объектная переменная типа Link. Поскольку класс Link является вложенным по отношению к LinkedList, его тип записывается в виде "полного имени" LinkedList.Link. Строки 6-12 содержат небольшую тестовую программу.
В строках 17-20 определяется конструктор класса LinkedList, в котором вызывается второй конструктор класса Link (строки 51-53). Последний объявлен с атрибутом Friend и потому доступен для внешнего класса Li nkedLi st. Если бы конструктор Link был объявлен с атрибутом Private, то он стал бы недоступным для внешнего класса.
Также стоит обратить внимание на то, как в первом конструкторе класса Link (строки 47-50) организуется ссылка на только что созданный элемент списка из предыдущего элемента. Для этого используется ключевое слово Me – это очень принципиальный момент, поэтому строка 49 выделена в листинге жирным шрифтом. На первый взгляд команда myParent.m_NextLink = Me выглядит недопустимой, поскольку мы обращаемся к закрытому полю родительского класса myParent. Однако программа все-таки работает! Итак, запомните очень важное правило:
Для экземпляра класса всегда доступны закрытые поля других экземпляров этого класса.
Примечание
При написании подобных классов в VB.NET можно обойтись и без использования этой нетривиальной особенности классов. Например, в класс Link можно включить специальный метод для создания ссылки на следующий элемент списка. В конечном счете выбор зависит только от вашего стиля программирования. Тем не менее сама возможность обращения к закрытым членам класса может преподнести неприятные сюрпризы, и об этом необходимо знать. По этой причине в нашем примере продемонстрирован именно такой подход.