Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Создание объектных переменных

Объявление пользовательских классов

Поддержка ООП в VBA

VBA представляет средства для использования имеющихся и создания новых объектов. Класс — это общее описание однородных по структуре объектов. Класс задает характеристики и поведение объектов. Классы в VBA оформляются в виде отдельных модулей.

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

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

// псевдокод описания объекта Студент Студент { Фамилия: строка Имя: строка Отчество: строка Дата_рождения: Дата Пол: символьный или логический Контактная_информация: строка } Студент.Полное_имя: строка, только чтение Студент.Полное_описание: строка, только чтение Студент.Править_описание (Нов_Фамилия, Нов_Имя, Нов_Отчество, Нов_Дата_рожд, _ Нов_Пол, Нов_Конт_Инф)

Как видно, такое описание очень напоминает описание пользовательского типа данных. Однако отличие объектного типа в том, что не только данные (Фамилия, Имя и пр.), но и код (Студент.Полное_имя и пр.) размещены совместно (инкапсулированы). Синтаксически, объявление класса в VBA выполняется в специализированной программной единице - модуле класса, куда помещается весь код создаваемого класса. Отметим, что в VBA не существует специальных языковых конструкций, используемых при описании класса (кроме описания свойств), поэтому порядок создания класса удобнее рассмотреть по шагам, а затем прокомментировать:

1. В редакторе Visual Basic добавляем в проект новый модуль класса (меню "Вставка/Модуль класса"). Откроется окно нового модуля класса.

2. В окне свойств (F4) задаем имя (Name) модуля (в нашем примере - CStudent). Оно же станет именем класса.

3. В разделе описаний модуля объявляем закрытые члены класса - обычные переменные уровня модуля (Private), которые будут определять значения свойств.

4. Инициализируем начальные значения свойств при помощи метода Class_Initialize (конструктора класса).

5. Определяем свойства для чтения (Property Let), для записи (Property Let) и объектные свойства (Property Set).

6. Создаем методы класса при помощи обычных процедур и функций.

7. Допустимо также создание метода Class_Terminate (деструктора класса) для удаления объекта из памяти по завершении работы с ним.

По этому алгоритму был создан ранее спроектированный класс CStudent, представляющий описание объекта "студент". Полный код модуля с комментариями приведен в листинге 24.

Листинг 24. Модуль класса

' Закрытые члены класса, прямой доступ к ним невозможен - ' только через свойства Private fLastName As String ' фамилия Private fFirstName As String ' имя Private fMiddleName As String ' отчество Private fBirthDay As Date ' дата рождения Private fGender As String * 3 ' пол Private fContacts As String ' адрес и телефон ' Конструктор класса. Вызывается в момент создания объектной переменной Private Sub Class_Initialize() fLastName = "Фамилия не указана" fFirstName = "Имя не указано" fMiddleName = "Отчество не указано" fContacts = "Адрес не указан" End Sub ' Свойства для чтения Public Property Get LastName() As String LastName = fLastName End Property Public Property Get FirstName() As String FirstName = fFirstName End Property Public Property Get MiddleName() As String MiddleName = fMiddleName End Property Public Property Get BirthDay() As Date BirthDay = fBirthDay End Property Public Property Get Gender() As String Gender = fGender End Property Public Property Get Contacts() As String Contacts = fContacts End Property ' Свойства для записи Public Property Let LastName(ByVal NewValue As String) fLastName = NewValue End Property Public Property Let FirstName(ByVal NewValue As String) fFirstName = NewValue End Property Public Property Let MiddleName(ByVal NewValue As String) fMiddleName = NewValue End Property Public Property Let BirthDay(ByVal NewValue As Date) fBirthDay = NewValue End Property Public Property Let Gender(ByVal NewValue As String) fGender = NewValue End Property Public Property Let Contacts(ByVal NewValue As String) fContacts = NewValue End Property ' Свойства ТОЛЬКО ДЛЯ ЧТЕНИЯ (нет парных Property Let) Public Property Get FullName() As String FullName = fLastName & " " & fFirstName & " " & fMiddleName End Property Public Property Get FullInfo() As String FullInfo = fLastName & Chr(9) & fFirstName & Chr(9) & fMiddleName & Chr(9) _ & CStr(fBirthDay) & Chr(9) & fGender & Chr(9) & fContacts End Property ' Метод для изменения свойств объекта. ' Все параметры объявлены как необязательные (Optional). ' Это позволяет изменять только необходимые поля класса. ' Изменять поля можно и через соответствующие свойства для записи (Property Let), ' этот метод приведен для примера Public Sub EditInfo(Optional LastName As String, Optional FirsName As String, _ Optional MiddleName As String, Optional BirthDay As Date, _ Optional Gender As String, Optional Contacts As String) fLastName = LastName fFirstName = FirstName fMiddleName = MiddleName fBirthDay = BirthDay fGender = Gender fContacts = Contacts End Sub

Дополнительные пояснения к коду листинга 24 в части синтаксиса:

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

2. Конструктор Class_Initialize предназначен для задания начальных значений переменным - членам класса и выполнения других операций инициализации. Он вызывается автоматически - в момент создания экземпляра класса.

3. Свойства класса объявляются с ключевым словом Property. При этом функция Property Get создает свойство для чтения, а процедура Property Let служит для записи значений в свойства базовых типов (в т.ч. массивов и пользовательских типов). Процедура Property Set служит для присваивания значений членам объектного типа (см. листинг 25). Общий синтаксис объявления свойств:

' для чтения [Public | Private] [Static] Property Get <имяФункции> [(<списокАргументов>)] [As <тип>] <операторы> имяФункции = возвращаемое значение [Exit Property] <операторы> имяФункции = возвращаемое значение End Property ' для записи [Public | Private] [Static] Property Let <имяПроцедуры> [(<списокАргументов>)] <операторы> [Exit Property] <операторы> End Property ' для работы с объектными членами класса [Public | Private] [Static] Property Set <имяПроцедуры> [(<списокАргументов>)] <операторы> [Exit Property] <операторы> End Property

4. Методы класса - это обычные процедуры и функции VBA, которые объявляются в модуле класса и не могут быть использованы самостоятельно.

VBA поддерживает один из основных принципов ООП, наследование, косвенным путем - через встраивание объектов. Т.е. нет прямой возможности создавать классы-потомки на основе ранее созданных классов, но можно объявлять членами класса переменные объектных типов. Пример встраивания приведен в листинге 31, где на основе классов CStudent (Студент) и CFaculty (Факультет) создается класс CGroup, описывающий учебную группу указанного факультета.

Листинг 25. Встраивание

' ---------------------------------------------- ' Модуль класса CFaculty - объект "Факультет" (приведен фрагмент кода) ' ---------------------------------------------- Private fTitle As String ' Название факультета Public Property Get Title() As String Title = fTitle End Property Public Property Let Title(NewTitle As String) fTitle = NewTitle End Property... ' ---------------------------------------------- ' Модуль класса CGroup - объект "Учебная группа" (приведен фрагмент кода) ' ---------------------------------------------- ' Встраивание объектных членов класса Private fFaculty As New CFaculty Dim fStudents() As New CStudent... ' Использование Property Set для задания значения объектному члену Public Property Set Faculty(Title) Set fFaculty = Title End Property ' Чтение названия факультета Public Property Get Faculty() As String Faculty = fFaculty.Title End Property...

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

1. явным указанием класса объекта;

2. ссылкой на ранее созданный объект.

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

1. При раннем связывании в момент объявления указывается класс объекта:

Dim <Переменная> As <классОбъекта>

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

2. При позднем связывании переменная объявляется так:

Dim <Переменная> As Object

Это объявление говорит о том, что переменная является объектом (ссылкой), но ничего не сказано о классе этого объекта. Он выяснится только динамически при выполнении программы, когда <Переменная> будет связываться с только что созданным или существующим объектом того или иного класса. Поэтому такое связывание и называется поздним, или динамическим.

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

Private | Public | Dim <имяОбъектнойПеременной> As New <имяКласса>

Например:

Public Faculty As New CFaculty Private Groups(3) As New CGroup Dim stud As New CStudent

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

<== предыдущая лекция | следующая лекция ==>
Пользовательский тип данных | Тема 2. 7 объектная модель компонентов MS Office. Библиотеки типов
Поделиться с друзьями:


Дата добавления: 2013-12-13; Просмотров: 528; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.