Многократное использование кода
Вероятно, главное преимущество ООП заключается в том, что написанный вами код может использоваться многократно. Вспомните свои первые программы на Visual Basic. Вы немедленно приступили к работе с объектами, даже не замечая этого. Вам не пришлось писать код для создания кнопок или форм. Visual Basic предоставил в ваше распоряжение все объекты, но открыл доступ лишь к тем свойствам и событиям, которые были необходимы для работы ваших приложений. Все тонкости внутренней реализации объектов остались скрытыми. По крайней мере вам не пришлось создавать свои кнопки «на пустом месте».
Создание класса
Чтобы вы лучше поняли, как проектируются и создаются объекты, давайте усовершенствуем наш класс «отдел кадров»:
1. Создайте новый проект типа Standard EXE.
2. Добавьте модуль класса. Для этого следует щелкнуть правой кнопкой мыши в окне проекта и выбрать из контекстного меню команду Add > Class Module.
3. В окне свойств задайте свойству Name значение clsHR.
4. Добавьте в секцию (General)(Declarations) окна программы объявления следующих свойств:
Option Explicit
Public Manager As Boolean
Public Dept As Integer
Public EmpID As Integer
Public EmpName As String
Public EmpDept As Integer
Public EmpPerformance As String
Public Reason As String
5. Наш класс должен выдавать личные дела сотрудников, поэтому в него следует добавить открытый метод:
Public Function GetRecord() As Boolean
If Manager = True Then
If Dept = GetDept() Then
Empname = GetEmpName()
EmpPerformance = GetPerfEval()
Reason = ""
GetRecord = True
Else
Reason = "Доступ к личным делам сотрудников " _
& "из других отделов запрещен"
GetRecord = False
End If
Else
Reason = "Доступ к личным делам сотрудников _
& "разрешен только менеджерам"
GetRecord = False
End If
End Function
6. Добавьте метод для определения отдела, в котором работает сотрудник:
Public Function GetDept() As Integer
Select Case EmpID
Case Is = 1
GetDept = 1
Case Is = 2
GetDept = 1
Case Is = 3
GetDept = 2
Case Else
GetDept = 0
End Select
End Function
7. Добавьте метод для получения имени сотрудника:
Public Function GetEmpNameO As String
Select Case EmpID
Case Is = 1
GetEmpName = "Джон Доу"
Case Is = 2
GetEmpName = "Джейн Доу"
Case Is = 3
GetEmpName = "Трокмортон"
Case Else
GetEmpName = ""
End Select
End Function
ПРИМЕЧАНИЕНа этом простейшем примере видно, каким образом класс ограничивает доступ к своим данным. Конечно, в реальной ситуации следовало бы обратиться к базе данных и сравнить значение в поле, вместо того чтобы «зашивать» данные внутри самого класса.
8. Нам также понадобится метод для получения оценки сотрудника:
Public Function GetPerfEval() As String
Select Case EmpID
Case Is = 1
GetPerfEval = "Бывает и лучше!"
Case Is = 2
GetPerfEval = "Неплохо работает в коллективе"
Case Is = 3
GetPerfEval = "Удовлетворительно"
Case Else
GetPerfEval = "Неизвестно"
End Select
End Function
9. Остается лишь проследить за правильной инициализацией свойств класса. Добавьте следующий фрагмент:
Private Sub Class_Initialize()
Manager = False
Dept = 1
EmpID = 0
EmpName = ""
EmpDept = 0
EmpPerformance = ""
Reason = ""
End Sub
Вот и все, что требовалось сделать для создания класса. Мы создали семь свойств: Manager, Dept, EmpID, EmpName, EmpDept, EmpPerformance и Reason. Логическое свойство Manager показывает, является ли автор запроса менеджером. Свойство Dept определяет отдел, в котором он работает. Свойство EmpID определяет код сотрудника, личное дело которого вы хотите получить. Если оно будет предоставлено, в EmpName заносится имя сотрудника. Свойство EmpDept показывает, в каком отделе работает сотрудник. В свойстве EmpPerformance хранится оценка. Наконец, если в запросе было отказано, в свойстве Reason возвращаются сообщение об ошибке и обоснование отказа.
Помимо свойств класс HR содержит четыре метода. Обратите внимание — только метод Get Record () объявлен открытым. Доступ к личным делам разрешается лишь после правильной обработки запроса. Теперь класс обладает всеми необходимыми возможностями, и его можно использовать в приложении. Давайте создадим интерфейс для работы с классом HR.
Использование класса
1. Активизируйте форму Form1. Задайте свойству Name значение frmHR, а свойству Caption — значение Отдел кадров.
2. Добавьте на форму три надписи и задайте их свойства.
Name: | Text: |
lblDept | Отдел |
lblManager | Менеджер? |
lblEmpID | Код сотрудника |
3. Добавьте на форму комбинированное поле и поместите его рядом с надписью lblDept. Задайте его свойства.
Name: | Style: |
cboDept | 2 - Dropdown List |
4. Добавьте два переключателя и задайте их свойства.
Name: | Caption: | Value: |
optYes | &Да | True |
optNo | &Нет |
5. Теперь нужно позаботиться о вводе кода сотрудника. Добавьте на форму текстовое поле и задайте его свойства.
Name: | Text: | |
txtEmpID | - | |
6. Наконец, поместите на форму кнопку.
Name: | Caption: |
cmdGetPE | &Получить оценку |
Разместите элементы так, как показано на рис. 15.4.
Рис. 15.4. Диалоговое окно Отдел кадров
7. Откройте окно программы и вставьте следующий фрагмент в секцию (General) (Declarations):
Option Explicit
Private hr As clsHR
8. Добавьте следующий фрагмент в процедуру события Form_Load():
Private Sub Form_Load()
' Создать экземпляр объекта HR
Set hr = New clsHR
'Добавить в список коды отделов
cboDept.Addltem "1"
cboDept.Addltem "2"
End Sub
Давайте на минуту задержимся и присмотримся к этому фрагменту. Команда New создает новый экземпляр класса clsHR. Перед тем как пользоваться классом, необходимо создать объект.
9. Перейдите к процедуре Form_Unload() и добавьте следующий фрагмент:
Private Sub Form_Unload(Cancel As Integer)
Set hr = Nothing
End Sub
ПРИМЕЧАНИЕСозданный объект надо уничтожить, когда в нем отпадет надобность. Для этого следует присвоить объекту Nothing, как это делалось на шаге 9. В противном случае объект останется в памяти.
10. Добавьте код, предназначенный для обработки нажатия кнопки cmdGetPE:
Private Sub cmdGetPE_Click()
Dim rc As Boolean
Dim msg As String
hr.Dept = Val(cboDept.Text)
hr.Manager = optYes.Value
hr.EmpID = Val(txtEmpID.Text)
If hr.GetRecord = True Then
msg = "Код сотрудника: " & _
Trim$(Str$(hr.EmpID)) & vbCrLf
msg = msg & "Имя сотрудника: " & _
Trim$(Str$(hr.EmpName)) & vbCrLf
msg = msg & "Оценка: &
hr.EmpPerformance
MsgBox msg
Else
msg = "He удалось получить сведения!" & vbCrLf
msg = msg & hr.Reason
End If
End Sub
Сохраните проект и запустите его. Вы можете выбрать код сотрудника от 1 до 3. Если вас интересует оценка его работы, не забудьте сообщить, что вы менеджер. Поиграйте с параметрами и проследите за результатами. На экране появляется диалоговое окно, в котором содержится либо имя и оценка сотрудника, либо сообщение об отказе в доступе (рис. 15.5).
Рис. 15.5. Класс HR за работой
Напоследок я покажу, как создать событие и сделать так, чтобы наш класс мог «отвечать» приложению:
1. Нажмите кнопку ОК, чтобы очистить окно сообщения (если это не было сделано ранее), и завершите приложение кнопкой [х] в правом верхнем углу формы.
2. Чтобы создать процедуру события, необходимо объявить ее в классе, для этого используется объявление вида Public Event. Вставьте следующую строку в секцию (General)(Declarations) класса clsHR:
Public Event ShowEval(Eval As String)
Обратите внимание: после того как событие будет включено в класс, вы должны вызвать (инициировать) его. В Visual Basic для этой цели применяется команда RaiseEvent.
3. Вместо того чтобы возвращать оценку работы в виде свойства, мы будем возвращать ее с помощью события. Удалите следующую строку из секции (General) (Declarations) класса clsHR:
Public EmpErformance As String
4. Также удалите из события (Class)(Initialize) следующую строку:
EmpPerformance=""
5. Перейдите к функции GetRecord() и удалите ее текущее содержимое. Замените его следующим кодом:
Private Function GetRecord() As Boolean
Dim EmpPerformance As String
If Manager = True Then
If Dept = GetDeptO Then
EmpName = GetEmpName()
EmpPerformance = GetPerfEval()
Reason = ""
GetRecord = True
Else
Reason = "Доступ к личным делам сотрудников " _
& "из других отделов запрещен"
GetRecord = False
End If
Else
Reason = "Доступ к личным делам сотрудников _
"разрешен только менеджерам"
GetRecord = False
End If
RaiseEvent ShowEval(EmpPerformance)
End Function
6. Откройте окно программы для формы frmHR.
7. Вставьте в секцию (General)(Declarations) объявление следующего вида:
Private WithEvents hr As clsHR
Ключевое слово WithEvents сообщает Visual Basic о том, что класс поддерживает события, доступ к которым может осуществляться из формы.
8. Для вывода результатов оценки необходимо добавить код в процедуру (hr) (ShowEval). Вставьте следующий фрагмент:
Private Sub hr_ShowEval(eval As String)
Dim msg As String
If eval <> "' Then
msg = "Код сотрудника: " & _
Trim$(Str$(hr.EmpID)) & vbCrLf
msg = msg & "Имя сотрудника: " & _
Trim$(Str$(hr.EmpName)) & vbCrLf
msg = msg & "Оценка: " & _
hr.EmpPerformance
Else
msg = "He удалось получить сведения!"
End If
MsgBox msg
End Sub
Сохраните и запустите проект. Поведение вашего приложения практически не изменилось, однако для достижения прежнего результата используется другой код. Продемонстрированная методика удобна в тех случаях, когда вам неизвестно, сколько времени займет процесс. Благодаря событиям ваша программа продолжит работу, не дожидаясь реакции пользователя! Класс сам сообщит о своей готовности.
ПОДСКАЗКАЧтобы использовать события в классе, необходимо предварительно определить событие конструкцией Public Event имя_ события() в секции (General)(Declarations) класса. После этого событие инициируется командой RaiseEvent. Наконец, при создании объекта в форме используется ключевое слово WithEvents.
Мы создали простейший объект на Visual Basic. Обратите внимание — сам по себе он не отображается на экране, но мы создали интерфейс для работы с ним. Некоторые объекты содержат встроенные формы, но большинство обходится без них. Создать класс не так уж сложно, если выделить время на проектирование перед тем, как приступать к написанию программы.