ПОНЯТНО О 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.




Содержание  Назад  Вперед