ПОНЯТНО О Visual Basic NET (том 3)

       

Из чего состоят классы, структуры и модули


Список компонентов. Вот из чего имеют право состоять классы, структуры и модули:

  • Процедуры (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.



    Содержание раздела