Из чего состоят классы, структуры и модули
Список компонентов. Вот из чего имеют право состоять классы, структуры и модули:
- Процедуры (Sub)
- Функции (Function)
- События (Event)
- Свойства (Property)
- Конструкторы (New)
- Объявления нелокальных переменных
- Объявления нелокальных констант
- Перечисления
- Структуры
- Классы
- Интерфейсы
- Делегаты
Классы внутри классов. Поговорим о содержимом классов. Мы привыкли к верхним 9 элементам списка, как к компонентам классов, потому что использовали их на практике. Мы не привыкли к 10 элементу списка – Классы. (Об интерфейсах и делегатах говорить не будем.) Получается, что классы могут включать в себя другие классы? Зачем? Рассмотрим пример проекта:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
A.B()
A.C.D()
End Sub
End Class
Public Class A
Public E As Integer
Public Shared Sub B()
Debug.WriteLine("Сработала процедура B класса A")
C.D()
End Sub
Public Class C
Public Shared Sub D()
Debug.WriteLine("Сработала процедура D класса C класса A")
End Sub
End Class
End Class
При щелчке по кнопке будет напечатано:
Сработала процедура B класса A
Сработала процедура D класса C класса A
Сработала процедура D класса C класса A
Что мы видим в коде? Мы видим два класса: Form1 и A. Класс Form1 состоит из единственной процедуры Button1_Click. Класс A состоит из переменной E, процедуры B и класса C, который в свою очередь состоит из процедуры D.
В данном случае не было смысла включать класс C внутрь класса A, так как ничего полезного из этого мы не извлекли. Попробуем теперь в строке
Public Class C
заменить Public на Private.
Мы сразу увидим, что строка
A.C.D()
дает ошибку, так как класс C становится недоступен снаружи своего «хозяина» – класса A. Строка же
C.D()
ошибки не дает, так как выполняется внутри класса A.
Вот в этом и смысл – в инкапсуляции. Если класс C нужен классу A для своих внутренних нужд и он не хочет делиться им с другими классами, класс C должен быть включен внутрь класса A и снабжен модификатором Private.
О структурах и модулях. Мы с вами не включали внутрь структур ничего, кроме переменных величин, теперь же мы видим, что туда позволено включать все остальное. Судя по тому, что классы, структуры и модули состоят из одинаковых компонентов, можно было бы сделать вывод, что структуры и модули очень близки к классам. Да, близки, но не очень. Например, от модулей нельзя порождать их экземпляры, как от классов мы порождаем объекты. Есть много и других отличий. Причины всего этого разнообразны, не всегда очевидны, относятся к разряду тонкостей и я на них не останавливаюсь.
О перечислениях. Об их грамматике достаточно сказано в 13.3.