Многократное использование кода

Вероятно, главное преимущество ООП заключается в том, что написанный вами код может использоваться многократно. Вспомните свои первые программы на 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. Обратите внимание — сам по себе он не отображается на экране, но мы создали интерфейс для работы с ним. Некоторые объекты содержат встроенные формы, но большинство обходится без них. Создать класс не так уж сложно, если выделить время на проектирование перед тем, как приступать к написанию программы.

 


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



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