Классы: схемы объектов
Обновлен: Ноябрь 2007
Классы являются символьными представлениями объектов и описывают свойства, поля, методы и события, которые формируют объект таким же способом, как чертежи описывают элементы, составляющие здания. Отдельный класс может быть использован для создания необходимого количества объектов так же, как по чертежу можно построить несколько зданий. Используя инкапсуляцию, классы контролируют доступ к элементам объекта так же, как в чертеже указываются части здания, доступные для использования.
Классы и объекты
Термины класс и объект иногда используются в одном значении, но, в действительности, классы описывают структуру объектов, а объекты являются используемыми экземплярами классов. Каждый экземпляр является точной копией класса, однако отличается от него. Поскольку объект является экземпляром класса, процесс создания объекта называется созданием экземпляра.
Если использовать сравнение с чертежом, то класс является чертежом, а объект является зданием, построенным по нему. В большинстве случаев изменение данных в одном объекте не изменяет данные в других объектах. (Исключением являются общие члены класса, объявленные с помощью модификатора Shared, которые существуют независимо от определенных экземпляров класса.)
Инкапсуляция
Инкапсуляция позволяет содержать группы связанных объектов и управлять доступом к ним. Классы предоставляют один из часто используемых способов инкапсуляции элементов. В следующем примере класс BankAccount инкапсулирует методы, поля и свойства, описывающие банковские счета.
Без использования инкапсуляции необходимо объявить отдельно процедуры и переменные для хранения и управления информацией о банковском счете. Это затруднит одновременную работу с несколькими банковскими счетами. С инкапсуляцией можно использовать данные и процедуры в классе BankAccount как модуль. Одновременная работа с несколькими банковскими счетами без ошибок возможна благодаря представлению каждого счета уникальным экземпляром класса.
Инкапсуляция позволяет контролировать способы использования данных и процедур. Чтобы предотвратить выполнение методов класса или чтения и изменение данных в свойствах и полях внешними процедурами, можно использовать модификаторы доступа, например Private или Protected. Следует объявить внутренние сведения о классе как Private, чтобы предотвратить их использование вне класса. Этот прием называется скрытие данных, благодаря ему защищаются такие сведения клиента, как баланс счета.
Данные класса должны изменятся или извлекаться только процедурами или методами Property — это одно из базовых правил инкапсуляции. Сокрытие сведений о реализации классов предотвращает их использование нежелательным образом и позволяет позже изменять такие элементы без риска возникновения проблем с совместимостью. Например, более поздние версии класса BankAccount могут изменить тип данных поля AccountBalance, не нарушая работу других приложений, которые используют это поле с определенным типом данных.
Наследование
Как и структуры Visual Basic, классы можно использовать для определения типов данных, инкапсулирующих группу связанных элементов. Однако в отличие от структур, классы Visual Basic могут наследовать и расширять характеристики других классов. Классы, служащие основой для новых классов, называются базовыми классами. Классы, являющиеся производными от базовых, называются производными классами. Производные классы наследуют все поля, свойства, методы и события базового класса. Это значит, что можно разрабатывать класс и выполнять его отладку один раз, а затем повторно использовать его в качестве основы для других классов.
В следующем примере определяется базовый класс, представляющий универсальный банковский счет, а также специальный класс, наследующий свойства базового класса, но предназначенный для описания текущего счета.
Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
End Property
End Class
Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class
Дополнительные сведения о наследовании см. в разделе Основы наследования.
Общие члены
По умолчанию данные класса индивидуальны для каждого экземпляра класса, но возможны случаи, когда необходимо совместное использование отдельного элемента данных во всех объектах, созданных из класса. В таких случаях используйте модификатор Shared, чтобы значение переменной было общим для всех экземпляров класса (общие члены в других языках программирования иногда называют "статическими членами"). При использовании имени класса возможен прямой вызов общих методов без предварительного создания экземпляра класса.
Дополнительные сведения об общих членах см. в разделе Общие члены в Visual Basic.
Переобъявление
Производные классы могут использовать ключевое слово Shadows для объявления члена с именем, совпадающим с именем наследуемого члена. Тип данных переобъявленных членов не обязательно должен совпадать с типом данных переобъявляемого члена. Например, свойство может переобъявлять переменную типа Integer.
Дополнительные сведения об общих членах см. в разделе Сокрытие в Visual Basic.