Работа с модулями классов

Другой тип модулей, заслуживающий нашего внимания, — модули классов, или просто классы. Классы представляют собой фундаментальные «строительные блоки» в так называемом объектно-ориентированном программировании (ООП). Одни и те же объекты используются на всех стадиях разработки проекта. Более подробная информация об ООП приведена в уроке 15.

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

Visual Basic позволяет вставлять классы в проект или компилировать их, превращая в элементы ActiveX — библиотеки динамической компоновки (DLL) или нестандартные элементы, которые раньше назывались OCX. Элемент ActiveX можно использовать в программе или внедрить в документ World Wide Web (обычно называемые документами HTML). Пример из урока 10, «Диалоговые окна», показывает, как создать класс нестандартного диалогового окна и откомпилировать его в ActiveX DLL. В уроке 17, «Использование ActiveX», приведена более конкретная информация по ActiveX. Как вы убедитесь, классы лежат в основе многих новых возможностей Visual Basic. А пока мы рассмотрим модули классов и их роль в ваших проектах, не вдаваясь в теоретические тонкости ООП.

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

Классы, как и стандартные модули, хранятся в отдельных файлах, однако они обязательно включают две процедуры — Class_Initialize() и Class_Terminate():

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

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

 

Методы

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

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

 

Private Function GetBalance(AccountNo As String) As Double

GetBalance = 10000000

End Function

 

Public Function DisplayAccountInfo(AccountNo As String, PIN As _

String) As Double

 

If AccountNo = "123456" And PIN = "5551289" Then

DisplayAccountlnfo = GetBalance(AccointNo)

End If

End Sub

 

Функция GetBalance объявлена закрытой, так как посторонним совершенно незачем знать о состоянии чужих счетов. Только представьте себе, как много друзей у вас появится, когда все узнают о вашем счете в 10 миллионов долларов! Чтобы ограничить доступ к информации, пользователь должен пройти через процедуру DisplayAccountlnfo. В этой процедуре перед получением информации о состоянии счета проверяются номер счета и личный идентификатор (PIN).

 

Свойства

Как вы узнали из урока 3, свойства — это переменные, предназначенные для получения и возвращения данных классов. Свойства, как и методы, бывают закрытыми и открытыми. Открытые свойства могут использоваться процедурами, находящимися вне области видимости данного класса. Открытые свойства образуют часть интерфейса класса. Закрытые свойства используются для хранения информации, не входящей в интерфейс. Они предотвращают намеренное или случайное изменение данных, обеспечивающих нормальную работу класса. Эти данные можно получить только с помощью специальных функций открытого интерфейса. Работа со свойствами классов осуществляется при помощи операторов Property Get, Property Let и Property Set. Оператор Property Get образует открытый интерфейс для получения значений переменных класса, к которым программа не может обратиться напрямую. Оператор Property Let выполняет противоположную задачу — он позволяет задавать значения переменных класса. Оператор Property Set позволяет передать объект по ссылке. Такая возможность может пригодиться, если модуль класса должен напрямую работать с внешним элементом (в следующем примере будет показано, как это делается). Свойства также можно создавать, объявляя их открытыми в данном классе. Операторы Property Get и Property Let позволяют создать простейшую модель безопасности для свойств класса. Вернемся к нашему примеру с банкоматом. Там есть два хороших претендента на роль свойств — переменные AccountNo и PIN. Давайте переработаем наш класс так, чтобы вы могли задать нужные значения свойств и затем вызвать методы без всяких параметров. Например:

 

Public AccountNo As String

Public PINNo As String

 

Private Function GetBalanceO As Double

GetBalance = 10000000

End Function

 

Public Function DisplayAccountlnfo() As Double

If AccountNo = "123456" And PINNo = "5551289" Then

DisplayAccountlnfo = GetBalance()

End If

End Function

 

А вот как выглядит тот же фрагмент с использованием операторов Property Let и Property Get:

 

Private AcctNo As String

Private PINNo As String

 

Private Property Let AccountNo(x As String)

AcctNo = x

End Property

 

Public Property Let PIN(x As String)

PINNo = x

End Property

 

Private Function GetBalance() As Double

GetBalance = 10000000

End Function

 

Public Function DisplayAccountlnfo() As Double

If AccountNo = "123456" And PIN = "5551289" Then

DisplayAccountlnfo = GetBalance()

End If

End Function

 

ПОДСКАЗКА Пользуйтесь ключевым словом Private, чтобы изолировать свойства и методы внутри классов. Тем самым вы защитите класс от некорректного обращения со стороны внешней программы. Делать открытыми (Public) следует лишь те свойства и методы, которые абсолютно необходимы для работы внешних программ.

 

События

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

мент выполняется то или иное условие. Приложение само сообщит вам об этом, инициируя событие.

Все стандартные процедуры, отображаемые в окне программы, относятся к событиям. Например, процедура Form_Load является событием.

Для определения событий в классе используются ключевые слова Public Event в секции (General)(Declarations) модуля. Синтаксис выглядит следующим образом:

 

Public Event EventName(napaметры)

 

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

 

Private WithEvents x As ClassName

 

Например, строка

 

Private WithEvents p As Person

 

объявляет закрытый объект р, созданный на основе класса Person (человек). Если бы наш «человек» мог говорить, класс мог бы содержать событие Speak. При объявлении события главную роль играет ключевое слово WithEvents. Без него вы могли бы обращаться к открытым свойствам и методам класса, но не к его событиям.

Почему же событиям уделяется так много внимания? Потому что они избавляют ваше приложение от необходимости активного опроса данных. Активным опросом называется многократная проверка некоторой величины до тех пор, пока не будет выполнено определенное условие. Цикл активного опроса поглощает ресурсы процессора и замедляет работу программы. Благодаря событиям ваша программа может заняться решением других задач до того момента, пока не будет инициировано соответствующее событие.

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

 

ПРИМЕЧАНИЕ Интерфейс класса представляет собой сочетание открытых свойств, методов и событий. Они образуют ту часть класса, которая может взаимодействовать с оставшейся частью приложения. Можно провести аналогию с визуальным интерфейсом (например, интерфейсом окна) — визуальный интерфейс тоже является единственным средством, с помощью которого вы можете общаться с приложением.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: