Структура класу

Кожен клас містить набір полів, методів, властивостей, подій (узагальнено їх називають членами класу). Розглянемо коротко кожну з цих складових класу. Більш докладний опис буде дано далі.

  • Поля - змінні, що належать класу або примірнику класу. Належність до класу або примірнику класу характерна не тільки для полів, а й для методів, подій і властивостей.
  • Методи - процедури і функції класу.
  • Властивості - синтаксична надбудова, що дозволяє здійснювати в формі виклик функції, аналогічної читання / запису змінної. Наприклад, можна оголосити властивість Вік і при спробі запису в нього від'ємного значення видавати помилку. Насправді це не чисто синтаксична надбудова. Властивості підтримуються не тільки самим компілятором, а й середовищем Visual Basic 2010 року (на рівні метаданих збірки), проте для простоти розуміння цей момент можна опустити.
  • Події - синтаксична надбудова, підтримувана компілятором і середовищем Visual Basic 2010, яка дозволяє викликати методи інших об'єктів, які підписалися на дану подію. Наприклад, хто підписався на подію Натискання об'єкта Кнопка , кожен раз при натисканні кнопки буде отримувати повідомлення (у вигляді виклику методу).

Кожна з цих складових класу, а також сам клас можуть мати так звані модифікатори доступу, які вказують область її видимості. Значення модифікаторів можуть бути наступними:

  • Public - відкритий клас або член класу. Доступ до нього дозволений з будь-якого місця коду;
  • Private - клас або член класу, доступний тільки з контексту, в якому він оголошений, і у всіх вкладених контекстах. Це означає, що якщо, наприклад, властивість оголошено з модифікатором Private, то вона є доступною тільки з того ж самого класу і з вкладених в нього класів;
  • Friend - клас або член класу, доступний тільки всередині тієї ж збірки, в якій оголошено. Збірка - повністю самостійна одиниця додатку .NET. У Visual Basic 2010 збірка зазвичай відповідає всій програмі, тому даний модифікатор можна сприймати як вказівку видимості тільки в межах програми;
  • Protected - член, доступний тільки з самого класу і з успадкованих класів. Даний модифікатор застосовується лише до членів класів;
  • Protected Friend - об'єднання областей видимості Protected і Friend. Член доступний в тій же збірці або в успадкованих класах.

Поряд з модифікаторами доступу, що регламентують видимість, члени класу можуть містити модифікатори, що встановлюють їх приналежність до класу або до примірника класу. Члени класу, що належать класу, називають роздільними (shared) або статичними (static) членами. Члени, які належать примірнику, називаються екземплярність (instance).

Щоб зрозуміти різницю між цими видами методів і полів (і як наслідок - властивостей і подій), необхідно більш детально розглянути механізм виклику методів і звернень до полів.

Оголошення класу фактично задає послідовність розташування полів в пам'яті і способи виконання функцій. При створенні конкретного екземпляра об'єкта відбувається виділення пам'яті відповідно до структури полів класу.

При виклику екземплярного методу як неявний параметр йому передається інформація про екземпляр класу, для якого викликаний цей метод (в Visual Basic 2010 ця неявне посилання позначається ключовим словом Me, а посилання на клас - MyClass). При виклику статичного методу така інформація не передається, тому статична функція може бути викликана і за відсутності будь-якого екземпляра класу. Звідси відразу випливає обмеження, що накладаються на статичні методи. Статичний метод не може звертатися до нестатичних методів і полів свого класу без зазначення конкретного екземпляра.

При зверненні до поля екземпляра класу доступ здійснюється за зміщенням відносно початку положення екземпляра класу в пам'яті. На відміну від екземпляра поля, статичне поле не вимагає конкретного об'єкта, оскільки воно створюється і ініціалізується всього один раз. Статичні поля аналогічні глобальним змінним в інших мовах програмування.

Середовищі Visual Basic 2010 не підтримує глобальних змінних в чистому вигляді. Замість них можна оголошувати статичні поля класу. Розглянемо приклад програми:

Module MyModule

    ' базовий клас

    Public Class SampleBase

        ' Деякий набір полів з різними модифікаторами доступу

        Private privateVar As Integer

        Public publicVar As Integer

        Friend friendVar As Integer

        Protected protVar As Integer

        ' відкритий метод

        Public Sub SomeMethod()

            privateVar = 5 ' Усередині класу доступні всі його поля

        End Sub

        ' Закритий метод, який повертає значення

        Private Function SomeOtherMethod() As Integer

            Return publicVar ' Відкриті поля доступні завжди

        End Function

        ' Відкрита властивість

        Public Property SomeProperty() As Integer

            Get

                Return privateVar

            End Get

            Set(ByVal Value As Integer)

                privateVar = Value

            End Set

        End Property

        ' Відкритий метод класу

        Public Shared Sub SharedMethod()

        End Sub

    End Class

    ' наслідуваний клас

    Public Class SampleInherited

        Inherits SampleBase

        Public Sub Test()

            protVar = 5 ' Припустимо: звернення відбувається з успадкованого класу

            privateVar = 6 ' Помилка: поле базового класу закрито

        End Sub

    End Class

    ' Точка входу в програму

    Sub Main()

        Dim a As New SampleBase

        a.friendVar = 5 ' Припустимо: звернення з тієї ж програми

        a.publicVar = 6 ' Припустимо: поле відкрито

        a.protVar = 7 ' Помилка: звернення відбувається не з успадкованого класу

        a.privateVar = 6 ' Помилка: поле класу закрито

        a.SomeProperty = 5

        SampleBase.SharedMethod()

    End Sub

End Module

В даному прикладі створюються класи SampleBase і SampleInherited (успадковується від SampleBase). У класі SampleBase оголошений набір полів, методів і одна властивість. При спробі відкомпілювати цей код буде видано повідомлення:

'SampleVBProject.MyModule.SampleBase.privateVar' is not accessible in this context because it is 'Private'.

'SampleVBProject.MyModule.SampleBase.protVar' is not accessible in this context because it is 'Protected'.

Це показує, що закриті члени недоступні поза контекстом класу, а захищені члени доступні тільки з класу і успадкованих від нього класів (в породженому класі звернення до захищеної змінної пройшло успішно).

Зверніть увагу на ім'я змінної в повідомленні про помилку:

sampleVBProject.MyModule.SampleBase.privateVar.

Воно являє собою повне ім'я члена класу, яке складається з простору імен (sampleVBProject), імені модуля (MyModule - модуль насправді є класом), імені класу (SampleBase), імені члена (privateVar).

Часткові класи

Назва "часткові класи", що з'явилося в Visual Basic 2005, трохи збиває з пантелику, оскільки вона не є типом даних і не має відношення до CLR. Насправді вона означає можливість поділу опису класу між декількома файлами. Ця можливість досягається шляхом використання ключового слова Partial. Наприклад, в одному файлі можна створити опис класу:

Public Class Complex

    Public Im As Double

End Class

а в інфому файлі

Partial Public Class Complex

    Public Re As Double

End Class

При цьому буде створено один клас, що містить поля Re і Im. Ця можливість використовується засобами генерації коду. Наприклад, частина коду форми, створюваного IDE, знаходиться в одному файлі, а обробники подій і функціонал - в іншому.