99556

Работа с классами и объектами в Visual Basic

Доклад

Информатика, кибернетика и программирование

Попробуем сделать собственный класс и объекты этого класса. Понятие объекта и класса Идея объекта заключается в том что некоторые данные и код предназначенный для работы с этими данными объединяются в единое целое инкапсулируются. В объявлении класса определяются свойства методы и события.

Русский

2016-09-23

451.2 KB

1 чел.

Работа с классами и объектами в Visual Basic

Идея объектно-ориентированного программирования - это представление программы в виде некоторой совокупности объектов, каждый из которых является представителем определенного класса. Вы уже работали с объектами, не замечая этого.  Попробуем сделать собственный класс и объекты этого класса.

1. Понятие объекта и класса

Идея объекта заключается в том, что некоторые данные и код, предназначенный для работы с этими данными, объединяются в единое целое, инкапсулируются. Внешний код может взаимодействовать с объектом через его свойства, методы и события. Один из возможных примеров объекта - управляющий элемент, который вы помещаете на форму на этапе визуального программирования. Он обладает методами, свойствами и событиями. Значения свойств вы можете задать на этапе визуального программирования, методами можете воспользоваться в кодах процедур обработки событий и кодах общих процедур. Однако роль объектов Visual Basic шире, чем в приведенном примере. Есть такие объекты, которые обеспечивают обмен данными с другими приложениями Windows, а элементы ActiveX способны обеспечить приложениям Windows еще более тесную связь.

Класс - это шаблон объекта. В объявлении класса определяются свойства, методы и события. Объект при этом - экземпляр класса, созданный по шаблону, заданному классом.

С другой стороны, классы можно рассматривать как своего рода пользовательские типы. Объекты - как переменные этих типов. Можно создать собственный класс, так же как собственный тип. Это позволит сделать соответствующую часть кода многократно используемой. Чтобы создать объект, относящийся к этому классу, его необходимо объявить, так же как необходимо объявить переменную, относящуюся к данному пользовательскому типу.

Рассмотрим пример, который позволит лучше понять сущность понятия класс.

Пусть пользовательский тип Book определен следующим образом:

Type Book

Name As String

Author As String

Page As Integer

End Type

Пусть также есть процедура Mes ( ):

Sub Mes( )

Dim S$

S$ = "Название:"& Name & vbTab & "Автор" & Author

MsgBox S$

End Sub

Представим себе, что эта процедура может быть элементом пользовательского типа Book:

Type Book

Name As String

Author As String

Page As Integer

Mes ( )

End Type

Определим экземпляр типа Book:

BookOne As Book

Присвоим значения:

BookOne.Name = "Бегущая по волнам"

BookOne.Author = "А. Грин"

BookOne.Page = 100

Можно осуществить следующий вызов:

BookOne.Mes ( )

Теоретически можно сказать, что это и есть сущность класса. Однако в реальности такой пример работать не будет. Visual Basic требует, чтобы свойства класса и методы создавались некоторым специальным образом.

2. Применение объектов

Вам известно, что к свойствам и методам объекта можно обратиться следующим образом:

ИмяОбъекта . Имя свойства

ИмяОбъекта . Имя метода

Часто удобно пользоваться переменной, которая может содержать в качестве своего значения объекты определенных типов. Синтаксис объявления такой переменной практически такой же, как при объявлении обычной переменной:

Public/Private/Dim ИмяПеременной As [New] ИмяОбъектоногоТипа

Если используется слово New, то будет создан новый объект соответствующего типа.

ИмяОбъектоногоТипа может быть именем класса.

Можно обратиться сразу к нескольким свойствам одного объекта с помощью оператора With. В этой конструкции можно вызвать и методы объекта.

Witn ИмяОбъекта

.свойство1 = значение1

.свойство2 = значение2

. . .

.свойствоN = значениеN

End With

Работать с объектами помогает каталог объектов - окно Object Browser (меню View). В нем находится информация об объектах и константах проекта и о других доступных объектах и константах Visual Basic.

Рис.1

В Visual Basic определены некоторые глобальные объекты. Они доступны в любом месте программы.

Cписок и сведения о наиболее важных глобальных объектах Visual Basic приведен в следующей таблице.

Таблица 1

Объект

Описание

App

Приложение содержит сведения об исполняемой программе

Clipboard

Буфер обмена Windows

Debug

Отладка - служит для поиска ошибок

Err

Содержит информацию об ошибках периода выполнения

Error

Служит для отладки приложений, работающих с базами данных

Printer

Позволяет обращаться к принтеру, как к объекту

Screen

Экран. В свойствах содержит параметры вывода на экран и позволяет обращаться к экрану, как к объекту

Каталог объектов удобен для просмотра собственных объектов. С его помощью можно увидеть все имеющиеся свойства, методы и события классов, используемых в проекте. Если из списка Project/Library выбрать имя проекта, в списке Classes появляются имена всех классов выбранного проекта. Имена всех свойств, методов и событий данного класса отображаются в списке Members Of после выбора нужного класса.

В окне подсказки отображается дополнительная информация, например, используемый тип данных. Для методов выводится список аргументов с указанием их типа данных, а также типа данных возвращаемого значения. Для события указываются аргументы и их типы данных.

Рис.2

3. Создание класса. Этапы создания класса

Класс подобен элементу управления ActiveX, но без графического интерфейса пользователя. Класс можно применять, но не программировать визуально. Для создания классов в Visual Basic используются модули классов, код которых размещается в файлах с расширением cls. Кратко опишем последовательность действий по созданию класса.

Первый этап - создание модуля класса (меню Project / Add Class Module).

Второй этап - создание свойств, методов и событий класса, которые определяют функциональные возможности класса и находятся в коде модуля класса.

Третий этап. Когда полностью готовый модуль класса включен в состав проекта, можно создавать объекты на основе класса. В Visual Basic доступ к объектам всегда производится посредством переменных.

4. Создание свойств класса

Кроме известных вам процедур Sub и Function, в Visual Basic есть третья категория - процедуры Property. C их помощью можно определить свойства класса. Чтобы процедуры были видимы из других модулей, их нужно объявлять как Public.

Если свойству извне присвоено значение, то должна выполняться процедура Property Let:

Public Property Let ИмяСвойства (ByVal vNewValue As Variant)

mVar = vNewValue

End Property

Переменная vNewValue содержит значение, присваиваемое свойству. Тип данных этой переменной должен соответствовать типу данных свойства.

mVar - внутренняя переменная класса, которой присваивается значение свойства. Служит для дальнейших преобразований внутри класса.

Чтобы значение свойства, присвоенное ему внутри класса, прочиталось извне, необходимо создавать процедуру Property Get:

Public Property Get ИмяСвойства ( ) As Variant

ИмяСвойства = mVar

End Property

Здесь, как в функции, возвращаемое значение присваивается имени процедуры. Эта процедура должна использовать тот же тип данных, что и процедура Property Let для данного свойства.

mVar - внутренняя переменная класса, значение которой присваивается значению свойства.

Разделение процедур свойств на процедуру присваивания и процедуру считывания легко позволяет создавать свойства, доступные только для чтения или только для изменения. Для этого достаточно вместо двух процедур создать одну, соответствующую.

Наиболее простой способ создания двух процедур, необходимых для функционирования свойства класса, состоит в использовании диалога Add Procedure в меню Tools.

5. Создание методов класса

Методы класса создаются для расширения функциональных возможностей объектов данного класса. Методы класса можно определить как процедуры или функции. Область видимости процедур и функций, определяющих методы класса, должна быть определена словом Public, т.к. они предназначены для вызова из других модулей. Процедуры и функции, объявленные как Private, могут использоваться только внутри класса.

Для создания метода с помощью процедуры (без возвращаемого значения) в модуль класса необходимо добавить процедуру Public Sub, имя которой будет именем метода. Например,

Public Sub ИмяМетода ( )

vVarName = vVarName + 6

End Sub

Обращение к такому методу аналогично вызову обычной процедуры.

При необходимости процедуре могут передаваться аргументы. Например,

Public Sub ИмяМетода (arg1, optional arg2 As Integer)

vVarName = arg1 + arg2

End Sub

C помощью аргументов передаются обрабатываемые элементы или определяется характер выполняемого действия.

Методы с возвращаемыми значениями создаются как Public Function, а имя функции становится именем метода. Например,

Public Function ИмяМетода ( )

ИмяМетода = vVarName + 7

End Sub

Возвращаемое значение присваивается имени функции. В методах такого типа также могут использоваться аргументы, действуют те же правила, что и в обычных функциях. Например,

Public Function ИмяМетода ( arg1, Optional arg2 As Integer)

ИмяМетода = arg1 + arg2

End Sub

Обычно код для методов больше и сложнее, чем код в процедурах свойств, потому что в них выполняется непосредственная обработка данных. Сложные задачи можно разбивать на несколько процедур или функций, которые объявляются как Private и используются только внутри класса. Таким образом данные инкапсулируются.

6. Создание событий класса

События являются основой управления в среде Windows. Объекты, определяемые пользователем, могут иметь свои события. Это реакция объекта на действия системы, пользователя или других приложений. Анализ и обработка событий позволяет объекту реагировать на внешние воздействия. Класс может иметь набор собственных событий. По умолчанию все классы содержат два события, которые происходят после загрузки и перед выгрузкой объекта.

Событие Initialize генерируется при создании объекта данного класса. Событие Terminate происходит, когда объект данного класса выгружается из памяти компьютера.

События, определяемые пользователем, создаются в два этапа. Сначала в общем разделе объявлений класса объявляется событие, а затем в процедуре внутри класса происходит вызов этого события.

Public Event ИмяСобытия ( )

. . .

Public Sub CallEvent ( )

RaiseEvent ИмяСобытия ( )

End Sub

Событие объявляется внутри класса с помощью слова Event. Если есть аргументы, то они обязательно должны указываться в строке объявления события.

Оператор RaiseEvent предназначен для генерации события внутри класса. Имя события передается в качестве аргумента.

Если объект данного класса должен генерировать события, то до создания процедуры обработки события в общих объявлениях нужно объявить объект, использующий ключевое слово WithEvents. Например, так:

Dim WithEvents Object As Class1

. . .

Private Sub Object_ИмяСобытия ( )

End Sub

Как и при создании свойств, для создания событий удобно использовать диалог Add Procedure в меню Tools.

7. Инкапсуляци, полиморфизм, наследование

Объекты и классы позволяют значительно упростить разработку приложений. Для разработчика важно, чтобы объект обеспечивал функции, которые он должен предоставить. Внутренняя реализация объектов не важна, она инкапсулирована, объекты защищены от внутреннего вмешательства. Взаимодействие с объектом происходит через свойства, методы и события - это интерфейс объектов.

Различные объекты могут обладать свойствами и методами с одинаковыми именами. Для разных объектов обращение к ним будет вызывать различную, но аналогичную реакцию. Это свойство объектно ориентированных языков называется полиморфизмом. В Visual Basic полиморфизм достигается благодаря концепции интерфейса класса. Ограничимся лишь упоминанием этого понятия и оговорим, что в Visual Basic можно создать интерфейс класса.

В объектно-ориентированных языках возможно создание новых классов на основе уже существующих. При этом вновь созданный класс обладает всеми функциональными возможностями класса - родителя. Этот механизм называется наследованием. Visual Basic поддерживает инкапсуляцию, отчасти поддерживает полиморфизм и не поддерживает наследования.

8. Пример создания класса

Рассмотрим последовательность создания модуля класса на примере класса Vector. У объектов класса будут определены три свойства: координата абсциссы, координата ординаты и длина вектора. Свойство ДлинаВектора будет определено только для чтения. Кроме того, для объектов класса Vector будут определены три метода: первый из них возвращает результирующий вектор как произведение вектора на число, второй - как результат скалярного произведения двух векторов и третий - как результат сложения двух векторов. Для создания модуля класса следует выполнить следующие действия.

1. Создать новый проект с именем Vector.VBP. Форме (рис. .3) установить имя frmMain. Для свойства Caption формы установить значение Программа Vector.

Рис. 3

2. Из меню Project (Проект) выполнить подпункт Add Class Module (Добавить модуль класса). Откроется диалоговое окно (см. рис. 4). В этом окне выбрать закладку New (Новый) и пиктограмму Class Module. Щелкнуть мышью по кнопке <Open> (Открыть). Откроется окно редактирования кода класса.

Рис. 4

3. Для свойства Name модуля класса установить значение Vector (рис. 5). Сохранить класс в файле с именем Vector.cls.

Рис. 5

4. При открытом окне редактирования кода класса из меню Tools (Сервис) выбрать подпункт Add Procedure (Добавить процедуру).

5. В диалоговом окне «Add Procedure» выбрать переключатель Property (Свойство), а затем в поле «Name» ввести имя свойства Абсцисса (рис. 6). Щелкнуть мышью по кнопке <Ok>.

Рис. 6

В окне редактирования кода класса в разделе «General» добавятся блоки процедур Property Get и Property Let для свойства Абсцисса (рис. 7)

Рис. 7

6. Таким же образом с помощью диалогового окна «Add Procedure» добавить в модуль класса свойства Ордината и Длина

Типы свойств, присвоенные им по умолчанию как Variant изменить на Double и удалить процедуру Property Let Длина, поскольку свойство Длина предназначено только для чтения (рис 7а).

Рис 7а

Для установленных свойств поместить нижеприведенный программный код:

Public Property Get Абсцисса() As Double

'Возвращает значение свойства Абсцисса

Абсцисса = X

End Property

Public Property Let Абсцисса(ByVal НоваяАбсцисса As Double)

'Устанавливает значение свойства Абсцисса

If Not IsNumeric(НоваяАбсцисса) Then

MsgBox "Абсцисса не является числом"

Exit Property

End If

X = НоваяАбсцисса

End Property

Public Property Get Ордината() As Double

'Возвращает значение свойства Ордината

Ордината = Y 

End Property

Public Property Let Ордината(ByVal НоваяОрдината As Double)

'Устанавливает значение свойства Ордината

 If Not IsNumeric(НоваяОрдината) Then

MsgBox "Ордината не является числом"

Exit Property

End If

Y = НоваяОрдината 

End Property

Public Property Get Длина () As Double

'Возвращает длину вектора, только для чтения

Длина = Sqr(X ^ 2 + Y ^2)

End Property

7. С помощью диалогового окна «Add Procedure» добавить в модуль класса три процедуры СуммаВекторов, УмножениеНаЧисло и СкалярноеПроизведение, которые реализуют методы. Поместить в них приведенный ниже программный код

Public Sub СуммаВекторов(ByVal НовыйВектор As Vector)

'Покоординатное сложение векторов

X = X + НовыйВектор.Абсцисса

Y = Y + НовыйВектор.Ордината

End Sub

Public Sub УмножениеНаЧисло(ByVal Число As Double)

'Покоординатное умножение вектора на число

If Not IsNumeric(Число) Then

MsgBox "Число, на которое умножается вектор не является числом"

Exit Sub

End If

X = Число * X

Y = Число * Y

End Sub

Public Function СкалярноеПроизведение(ByVal НовыйВектор As Vector)

'Скалярное произведение векторов

СкалярноеПроизведение = X * НовыйВектор.Абсцисса + Y * НовыйВектор.Ордината

End Function

8. В разделе "General" модуля класса объявить переменные, которые будут являться носителями свойств класса в его экземплярах:

'X - координата абсциссы

'Y - координата ординаты

Option Explicit

Dim X As Double, Y As Double

9. Сохранить созданный модуль класса.

9. Создание проектов с использованием классов

В разрабатываемых проектах можно использовать как встроенные классы и объекты, так и собственные классы.

Рассмотрим пример проекта, использующего созданный в п. 8 собственный класс Vector. Для этого следует выполнить действия.

1. В окне «Project Explorer» выбрать форму frmMain, затем щелкнуть мышью по кнопке <View Code>, откроется «Окно редактирования кода».

2. В разделе "General" формы frmMain добавить следующий код:

'Проверяет работу модуля класса Vector

Option Explicit

Dim A As Double, S As Double

3. Добавить строки кода в процедуры Command1_Click() и Command2_Click():

Private Sub Command1_Click()

   Dim МойВектор, ДругойВектор, ЕщеВектор As Vector

   Set МойВектор = New Vector

   With МойВектор

       .Абсцисса = Text1.Text

       .Ордината = Text2.Text

   End With

   A = МойВектор.Длина

   Label13.Caption = CStr(A)

   МойВектор.УмножениеНаЧисло Число:=Text5.Text

   Label15.Caption = "X=" & CStr(МойВектор.Абсцисса)

   Label16.Caption = "Y=" & CStr(МойВектор.Ордината)

   With МойВектор

       .Абсцисса = Text1.Text

       .Ордината = Text2.Text

   End With

   Set ЕщеВектор = New Vector

   With ЕщеВектор

       .Абсцисса = Text3.Text

       .Ордината = Text4.Text

   End With

   A = ЕщеВектор.Длина

   Label14.Caption = CStr(A)

   МойВектор.СуммаВекторов НовыйВектор:=ЕщеВектор

   Label17.Caption = "X=" & CStr(МойВектор.Абсцисса)

   Label18.Caption = "Y=" & CStr(МойВектор.Ордината)

   With МойВектор

       .Абсцисса = Text1.Text

       .Ордината = Text2.Text

   End With

   S = МойВектор.СкалярноеПроизведение(НовыйВектор:=ЕщеВектор)

   Label19.Caption = CStr(S)

End Sub

Private Sub Command2_Click()

End

End Sub4. Сохранить изменения и запустить программу.

10. Создание проектов с использованием ранее созданных классов

В предыдущем примере класс разрабатывался непосредственно в проекте, поэтому дополнительных действий по включению класса не требовалось. При создании новых проектов, которые будут использовать уже созданные классы, необходимо выполнять действия по включению нужных классов в создаваемые проекты. Для подключения класса в проект следует выполнить следующие действия.

1. В меню Project выбрать пункт Add Class Module (Добавить модуль класса).

2. В открывшемся диалоговом окне «Add Class Module» щелкнуть мышью на закладке Existing.

3. Используя окно «Add Class Module», найти нужный класс, затем щелкнуть по кнопке <Открыть>.

Таким же образом в создаваемый проект можно подключать несколько классов.

Задание1. У объекта класса Vector определите свойство координата аппликата и для объектов класса Vector определите методы векторное и смешанное произведение векторов.

Задание2. Создать свой класс объектов.