Объектно-ориентированное программирование (Visual Basic)
Visual Basic обеспечивает полную поддержку объектно-ориентированного программирования, включая инкапсуляцию, наследование и полиморфизм.
Инкапсуляция означает, что группа связанных свойств, методов и других членов рассматривается как единый элемент или объект.
Наследование описывает возможность создания новых классов на основе существующих классов.
Полиморфизм означает, что можно иметь несколько взаимозаменяемых классов, даже если каждый класс реализует одни и те же свойства или методы разными способами.
В этом разделе рассматриваются следующие понятия.
Классы и объекты
Термины класс и объект часто взаимозаменяемы, но в действительности классы описывают типы объектов, а объекты — это используемые экземпляры классов. Поэтому процесс создания объекта называется созданием экземпляра. Если использовать сравнение с чертежом, то класс является чертежом, а объект является зданием, построенным по нему.
Определение класса:
Class SampleClass
End Class
Visual Basic также предоставляет светлую версию классов, называемых структурами , которые полезны при создании большого массива объектов и не хотят использовать слишком много памяти для этого.
Определение структуры:
Structure SampleStructure
End Structure
Дополнительные сведения см. в разделе:
Члены класса
Каждый класс может состоять из различных членов класса, которые содержат свойства, описывающие данные класса, методы, задающие поведение класса, и события, обеспечивающие связь между различными классами и объектами.
Свойства и поля
Поля и свойства представляют сведения, содержащиеся в объекте. Поля подобны переменным в том, что их можно прочитать или изменить напрямую.
Определение поля:
Class SampleClass
Public SampleField As String
End Class
Для работы со свойствами используются процедуры "Get" и "Set", которые расширяют возможности управления способом задания и возврата значений.
Visual Basic позволяет создать частное поле для хранения значения свойства или использовать так называемые автоматически реализованные свойства, которые автоматически создают это поле за кулисами и предоставляют базовую логику для процедур свойств.
Чтобы определить автоматически реализованное свойство, выполните следующее:
Class SampleClass
Public Property SampleProperty as String
End Class
Если требуется выполнить дополнительные операции чтения и записи применительно к значению свойства, определите поле для хранения значения свойства и затем реализуйте базовую логику для хранения и извлечения этого значения:
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
У большинства свойств есть методы или процедуры для задания и возврата значения свойства. Однако можно создать свойства, доступные только для чтения или только на запись, чтобы запретить изменение или чтение значений свойств. Для этого в Visual Basic можно использовать ключевые слова ReadOnly
и WriteOnly
. Однако автоматически реализованные свойства не могут быть доступны только для чтения или записи.
Дополнительные сведения см. в разделе:
Методы
Действие, которое выполняет объект, называется методом.
Примечание.
В Visual Basic существует два способа создания метода: с помощью оператора Sub
(если метод не возвращает значение) или с помощью оператора Function
(если метод возвращает значение).
Определение метода класса:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
Класс может иметь несколько реализаций или перегрузок одного и того же метода, которые отличаются от других числом или типами параметров.
Перегрузка метода:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Как правило, метод объявляется при определении класса. Однако Visual Basic также поддерживает методы расширения, которые позволяют добавлять методы в существующий класс за пределами фактического определения класса.
Дополнительные сведения см. в разделе:
Конструкторы
Конструкторы — это методы классов, выполняемые автоматически при создании объекта заданного типа. Обычно конструкторы выполняют инициализацию членов данных нового объекта. Конструктор можно запустить только один раз при создании класса. Кроме того, код конструктора всегда выполняется раньше всех остальных частей кода в классе. Следует отметить, что так же, как и для других методов, можно создать несколько перегрузок конструктора.
Определение конструктора для класса:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Дополнительные сведения см. в статье "Время существования объекта: как создаются и уничтожаются объекты".
Деструкторы
Деструкторы используются для уничтожения экземпляров классов. В платформе .NET Framework сборщик мусора автоматически управляет распределением и освобождением памяти для управляемых объектов приложения. Однако для очистки неуправляемых ресурсов, создаваемых приложением, могут потребоваться деструкторы. На один класс допускается только один деструктор.
Дополнительные сведения о деструкторах и сборке мусора в .NET Framework см. в разделе Сборка мусора.
События
События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или порождающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. Дополнительные сведения о том, как порождаются и обрабатываются события, см. в разделе События.
Чтобы указать обработчики событий с помощью декларативного способа, используйте инструкцию WithEvents и предложение Handles .
Чтобы динамически добавлять, удалять и изменять обработчик событий, связанный с событием, используйте инструкцию AddHandler и RemoveHandler вместе с оператором AddressOf.
Вложенные классы
Класс, определенный внутри другого класса, называется вложенным. По умолчанию вложенный класс является частным.
Class Container
Class Nested
' Add code here.
End Class
End Class
Чтобы создать экземпляр вложенного класса, укажите имя класса контейнера и имя вложенного класса, используя в качестве разделителя точку:
Dim nestedInstance As Container.Nested = New Container.Nested()
Модификаторы доступа и уровни доступа
С помощью модификаторов доступа все классы и члены классов могут указывать уровни доступа, предоставляемые другим классам.
Имеющиеся модификаторы доступа указаны в следующей таблице.
Модификатор Visual Basic | Определение |
---|---|
Открытый | Доступ к типу или члену возможен из любого другого кода в той же сборке или другой сборке, ссылающейся на него. |
Частное | Доступ к типу или члену можно получить только из кода в том же классе. |
Protected | Доступ к типу или члену можно получить только из кода в том же классе или в производном классе. |
Friend | Доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки. |
Protected Friend |
Доступ к типу или члену возможен из любого кода в той же сборке, или из производного класса в другой сборке. |
Дополнительные сведения см. в разделе "Уровни доступа" в Visual Basic.
Создание экземпляров классов
Чтобы создать объект, необходимо создать экземпляр класса.
Dim sampleObject as New SampleClass()
После создания экземпляра класса можно присваивать значения свойствам и полям экземпляра и вызывать методы класса.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
Чтобы назначить значения свойствам в процессе создания экземпляра класса, используйте инициализаторы объектов:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Дополнительные сведения см. в разделе:
Общие классы и члены
Общий член класса — это свойство, процедура или поле, совместно используемое всеми экземплярами класса.
Чтобы определить общий член, выполните следующее:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Чтобы получить доступ к общему члену, используйте имя класса без создания объекта этого класса:
MsgBox(SampleClass.SampleString)
Общие модули в Visual Basic имеют только общие члены и не могут быть созданы экземпляры. Общие члены также не могут получить доступ к не общим свойствам, полям или методам
Дополнительные сведения см. в разделе:
Анонимные типы
Анонимные типы позволяют создавать объекты без написания определения класса для типа данных. Вместо этого компилятор создает класс для вас. Данный класс не имеет имени и содержит свойства, которые указаны при объявлении объекта.
Создание экземпляра анонимного типа:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Дополнительные сведения см. в разделе Анонимные типы.
Наследование
Наследование позволяет создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в другом классе. Класс, члены которого наследуются, называется базовым классом, а класс, который наследует эти члены, называется производным классом. Однако все классы в Visual Basic неявно наследуются от Object класса, который поддерживает иерархию классов .NET и предоставляет низкоуровневые службы для всех классов.
Примечание.
Visual Basic не поддерживает несколько наследование. То есть можно указать только один базовый класс для производного класса.
Наследование от базового класса:
Class DerivedClass
Inherits BaseClass
End Class
По умолчанию унаследовать класс можно от любого класса. Однако можно указать, должен ли класс использоваться в качестве базового класса, или создать класс, который может использоваться только в качестве базового.
Указание, что класс не может использоваться в качестве базового класса:
NotInheritable Class SampleClass
End Class
Указание, что класс может использоваться только в качестве базового класса и нельзя создать экземпляр этого класса:
MustInherit Class BaseClass
End Class
Дополнительные сведения см. в разделе:
Переопределение элементов
По умолчанию производный класс наследует все члены от своего базового класса. Если необходимо изменить поведение унаследованного члена, необходимо переопределить его. Т. е. в производном классе можно определить новую реализацию метода, свойства или события.
Следующие модификаторы используются для управления переопределением свойств и методов.
Модификатор Visual Basic | Определение |
---|---|
Переопределяемые | Разрешает переопределение члена класса в производном классе. |
Переопределения | Переопределяет виртуальный (переопределяемый) член в базовом классе. |
NotOverridable | Запрещает переопределение члена в наследующем классе. |
MustOverride | Требует, чтобы член класса был переопределен в производном классе. |
Shadows | Скрывает член, наследуемый от базового класса |
Интерфейсы
Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но, в отличие от классов, интерфейсы не предоставляют реализацию. Они реализуются классами, но определяются как отдельные от классов сущности. Интерфейс представляет собой контракт, в котором класс, реализующий интерфейс, должен реализовывать каждый аспект этого интерфейса в точном соответствии с его определением.
Определение интерфейса:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Реализация интерфейса в классе:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Дополнительные сведения см. в разделе:
Универсальные шаблоны
Классы, структуры, интерфейсы и методы в .NET могут включать параметры типа, определяющие типы объектов, которые они могут хранить или использовать. Наиболее распространенным примером универсального шаблона является коллекция, в которой можно указать тип объектов, которые могут в ней храниться.
Определение универсального класса:
Class SampleGeneric(Of T)
Public Field As T
End Class
Создание экземпляра универсального класса:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Дополнительные сведения см. в разделе:
Делегаты
Делегат — это тип, который определяет сигнатуру метода и может обеспечивать связь с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам.
Примечание.
Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. Дополнительные сведения об использовании делегатов при обработке событий см. в разделе События.
Создание делегата:
Delegate Sub SampleDelegate(ByVal str As String)
Создание ссылки на метод, сигнатура которого соответствует сигнатуре, указанной делегатом:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
Дополнительные сведения см. в разделе: