Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемvfpdev.narod.ru
1 OOP в Visual FoxPro 6.0 (основные понятия и инструментальные средства среды разработки) OOP в Visual FoxPro ® 6.0 (основные понятия и инструментальные средства среды разработки) Дроздов Михаил Компания «ИВС Софт» My Page: My Page: ICS Page:
2 Определение класса: свойства, методы и события 1(3) Объект: совокупность данных и функций реализуется в виде класса. В классе определяются: свойства, методы, и события. –событие - реакция на внешнее воздействие, предопределённая классом (нельзя создавать новые). Код, помещённый в событие выполняется при возникновении соответствующего события. Ряд, событие может быть возбуждено программно. –свойство - это VFP переменная (массив), определённая в классе. –метод - процедура-функция, определённая в классе. Свойства, и методы могут быть добавлены/удалены из класса, однако нет возможности удаления свойств и методов, «предопределённых классом» и «унаследованных».
3 Определение класса: область видимости свойств и методов 2(3) Область видимость свойств и методов задаётся как Public, Protected или Hidden при их определении в классе: –Public - доступно извне, внутри и в производных данного класса. –Protected - доступно внутри и в производных данного класса. –Hidden - только внутри данного класса. Класс существует в виде определения (DEFINE CLASS … AS...) в коде prg-файла или в библиотеке классов (vcx-файле), структура последнего совпадает с dbf- файлом: –*.vcx - аналог dbf –*.vct - аналог fpt Доступные извне (public) свойства, методы и события, определяют внешний интерфейс класса. Определения не могут быть вложенными, т.е. Не может быть определён класс внутри класса или метод внутри метода.
4 Определение класса: понятия инкапсуляции, наследования, полиморфизма 3(3) VFP классы обладают указанными в заголовке свойствами, каждое из которых означает следующее: Инкапсуляция (encapsulation) - сокрытие части свойств и методов, для внешнего использования. Наследование (inheritance) - на основе одного класса может быть создан другой, содержащий в себе все «открытые для него» методы и свойства первого. Полиморфизм (polymorphism) - грубо говоря, возможность существования в разных классах одинаково названных методов, но выполняющих различные функции. Данное свойство не поддерживается в VFP напрямую, поскольку не существует в VFP понятия перегружаемой (virtual) функции, однако благодаря наличию команды NODEFAULT и функции DODEFAULT() вполне возможно смоделировать это свойство. (следует также отметить, что указанная возможность будет «работать» только в VFP классах и не будет в ActiveX компонентах)
5 Контроль доступа к свойствам класса: методы Access и Assigne В VFP включены два определяемые пользователем метода, обеспечивающих контроль типа чтения-запись любого свойства класса («стражи» свойства). Access - метод, вызываемый при попытки использования свойства, например, сохранение значения свойства некоторой переменной. Assigne - метод, вызываемый при попытки изменения свойства, например, при попытке присвоение значению свойства нового значения. Очевидно, что этот метод не будет никогда вызываться для свойства Read only (только для чтения) Могут быть созданы как в режиме проектирования, так и непосредственно из кода. PROCEDURE MyPropName_ASSIGN LPARAMETERS NewValueForMyProp … ENDPROC Поскольку метод Assigne получают новое значение свойства через параметр, то логика, заключённая в код этого метода определяет, в конечном счёте: будет ли присвоено новое значение этому свойству класса Даёт возможность писать реализацию, для полностью открытого интерфейса, тем не менее защищая значения свойств.
6 Использование класса: создание объекта 1(1) Ссылку нужно где-то хранить: На основании определения (описания) класса создаётся экземпляр класса, или объект класса. Ссылка на полученный экземпляр класса обычно сохраняется в некоторую область памяти: это может быть глобальная/локальная переменная или свойство некоторого другого объекта (созданная либо явно Вами или неявно в режиме Designe). Экземпляр класса (или объект) может быть создан явно в режиме выполнения (runtime) или неявно при проектировании (designe) При явном создать экземпляр класса с использованием функции CreateObject() или метода AddObject (), так или иначе, необходимы два действия [Visible =.F.]: –обеспечить «видимость» соответствующей библиотеки класса SET CLASS LIB TO... –выполнить функцию oMyObj = CreateObject(MyClassLib.MyClassInLib[,...]) или This.AddObject(oMyObj, MyClassLib.MyClassInLib[,...]) При явном создать экземпляр класса с использованием функции NewObject() первое действие излишне, поскольку библиотека явно указывается в параметрах этой функции [Visible =.F.]. При создании объекта в режиме проектирования библиотека будет определена неявно, а свойство Visible Вы можете настроить в окне Properties
7 Использование класса: уничтожение объекта 2(3) Ссылку нужно где-то хранить: На основании определения (описания) класса создаётся экземпляр класса, или объект класса. Ссылка на полученный экземпляр класса обычно сохраняется в некоторую область памяти: это может быть глобальная/локальная переменная или свойство некоторого другого объекта (созданная либо явно Вами или неявно в режиме Designe). Следите за уничтожением Ваших объектов: –Уничтожение переменной, содержащей ссылку на экземпляр класса, приводит к разрушению соответствующего экземпляра объекта. Для локальной переменной это будет происходить при «закрытии» её «области видимости». –Однако, если такая ссылка храниться как свойство некоторого другого объекта, то последний не может быть уничтожен до тех пор, пока не будут разрушены все его свойства-ссылки-на-экземпляры-объектов (Например, This.oMyObj = NULL обычно в событии Destroy этого класса). –Обычно не требуется никаких действий с Вашей стороны, для уничтожения экземпляров объектов, добавленных в экземпляр класса в Designe или RunTime с помощью This.AddObject(...)
8 Использование класса: доступ к объектам 3(3) Внутри объекта: Адресация осуществляется с использованием таких ключевых слов как This, ThisForm, ThisFormSet, а также Parent. В режиме Designe, для правильной адресации на объект лучше использовать Object List... (пункт меню, возникающего по нажатию правой клавиши мыши) Например, WITH This.Parent.Parent.ActiveCell(1,.ActiveColumn) ENDWITH Извне объекта: Для адресации к свойствам/методам/событиям извне объекта, так или иначе, необходимо знать место хранения объектной ссылки на этот объект. CLEAR goMayObj PUBLIC goMayObj goMayObj = CreateObject(…) … goMayObj.MyMethod() LOCAL lnCntForn ACTIVATE SCREEN CLEAR FOR lnCntForn = 1 TO _SCREEN.FormCount ? _SCREEN.Forms(lnCntForn).Name ENDFOR
9 Базовые классы VFP и некоторые особенности обработки событий Control (исключая Custom) –не имеет метода AddObject() –все добавляемые свойства защищённые Container: –все добавляемые объекты «открыты» События Container происходят независимо от событий Control Это правило распространяется и на элементы Grid, т.е. каждый элемент «работает» независимо... И наоборот, в групповых элементах по событию на элементе отрабатывает событие группового элемента, но только в том случае, если нет кода в событии элемента. При наследовании объектов контроль: какой код надо выполнить идёт от производных к родительским. Лучший способ узнать, что происходит - «Журнал событий»
10 Не визуальных: Класс-оболочка (покрытия или интерфейсные «преобразователи») Класс-менеджер (управление другими классами «надзиратели») Бизнес-класс (логика обработки данных или моделирование предметной области) Визуальные: Одиночные элементы управления Групповые элементы управления Контейнеры Экранные формы Панели инструментов Условные подгруппы (или категории) классов
12 Элемент, включённый в Control нельзя «расширить» (это можно сделать только за счёт родительского класса этого элемента). Обращение к контейнеру из метода Init() включённого в него объекта недопустимо (поскольку контейнер ещё не создан). И наоборот, всю «настройку» включённых в контейнер компонент, следует производить в событии Init() контейнера (когда все включённые в него элементы уже существуют). Из методов/событий формы нет возможности управлять открытием таблиц в DataEnvironment. Все установки для данных (SET DELETED ON,...) в Private DataSession следует производить в событии MyForm.DataEnvironment.BeforOpenTables() (когда данные ещё не открывались) Какую-либо настройку данных, с которыми работают элементы, включённые в форму, следует выполнить в событии Load() формы (пока эти объекты ещё не создавались). Наличие класса Container позволяет применить модульный подход при программировании с использованием классов, - так называемое агрегирование Некоторые выводы из анализа последовательности создания элементов
13 Типы переменных: Область видимости: Типы полей: Именование переменных 1(2)
14 Элементы/Классы: Именование переменных 1(2)
15 Доступ к классам Из проекта приложения: … или пункт меню Tools\Class Browser[Component Gallery]
16 Манипулирование классами из Project Manager Добавить новый класс как производный от указанного: Название производного Выбор библиотеки и название базового класса В какую библиотеку записываем «Перетащив и отпустив»: Вы можете скопировать класс из одной библиотеки в другую, как в рамках одного проекта, так и между проектами Добавить библиотеку в проект Предупреждение: Все библиотеки, используемых классов, должны быть помещены в проект при неявном использовании классов.
17 Class Browser Перемещение класса +CTRL Копирование Фильтр названия класса Типы файлов: DO (_BROWSER) WITH […]
18 Class Browser Component Gallery Открыть новый файл Добавить новый файл Просмотр исходного кода класса Найти класс Создать новый класс Переименовать класс У активного класса –переопределить родительский класс на выбранный Уничтожить записи, помеченные как удалённые Class Browser: панель команд
19 Создание библиотеки: CREATE CLASSLIB ClassLibraryName Создание класса: CREATE CLASS ClassName | ? [OF ClassLibraryName1 | ?] [AS cBaseClassName [FROM ClassLibraryName2]] [NOWAIT] Добавление/копирование: ADD CLASS ClassName [OF ClassLibraryName1] TO ClassLibraryName2 [OVERWRITE] Удаление класса: REMOVE CLASS ClassName OF ClassLibraryName Переименование класса: RENAME CLASS ClassName1 OF ClassLibraryName TO ClassName2 Команды работы с классами в библиотеках классов Для перемещения следует последовательно выполнить сначала копирование, затем удаление DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC] [[PROTECTED | HIDDEN PropertyName1, PropertyName2...] [Object.]PropertyName = eExpression...] [ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT] [WITH cPropertylist]]... [[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN] | THIS_ACCESS [NODEFAULT] cStatements [ENDFUNC | ENDPROC]]... ENDDEFINE
20 Предупреждения: Класс, помещённый в проект компилируется целиком и отсутствует возможность отключить (Exclude) от компилирования некоторого подмножества классов такой библиотеки. Т.е., если библиотека содержит классы, не используемые непосредственно в данном приложении, они всё равно помещаются в код исполняемого файла. Поэтому следует тщательно планировать состав библиотек. При использовании библиотек, не помещённых в проект, необходимо их присутствие на диске во время выполнения. Нужно очень сильно подумать прежде чем решиться на переименование и тем более удаление классов из библиотек. При переименовании Class Browser учтёт это для всех производных классов, открытых в данный момент в нём, но есть ли гарантия, что во время переименования точно все библиотеки, использующие пер именуемый класс открыты? Заведите себе за правило: всегда создавать дополнительную резервную копию перед попыткой выполнения переименования и/или удаления класса. Если всё-таки горе случилось, вспомните, что библиотека храниться в виде обычного dbf-файла. Не допускайте перемещения библиотек и используемых в них ресурсов из одних каталогов в другие, помните о межбиблиотечных связях, и используемых внешних элементов (ресурсов): иконок, include-файлов, и т.д, которые станут «без определённого места жительства». Следует исключит какое-либо копирование классов из одной библиотеки в другую. Поскольку, в конечном счёте, это приведёт к потере контроля над используемыми классами. Используйте технику создания производных классов, особенно классов, входящих в состав FFC, никогда не изменяйте их непосредственно. Помните, что Microsoft регулярно обновляет эту библиотеку, выпуская её новы версии. Регулярно выполняйте резервное копирование Ваши библиотек. Выделите должность администратора библиотек, который бы отвечал за их рабочее состояние.
21 Галерея компонент Перемещение компонента реакция зависит от типа компонента DO (_GALLERY) - из кода добавляет компонент добавляет библиотеку открывает на ред.
22 Галерея компонент
25 Редактор классов (Class Designer)
28 @... CLASS Command _WIZARD System Memory Variable ACLASS( ) Function ADATABASES( ) Function ADBOBJECTS( ) Function ADD CLASS Command AddProperty Method AGETCLASS( ) Function AINSTANCE( ) Function AMEMBERS( ) Function AMOUSEOBJ( ) Function ASELOBJ( ) Function AVCXCLASSES( ) Function _BUILDER System Memory Variable COMCLASSINFO( ) Function COMPOBJ( ) Function CREATE CLASS Command CREATE CLASSLIB Command CREATEOBJECT( ) Function DEFINE CLASS Command DISPLAY OBJECTS Command GETOBJECT( ) Function GETHOST( ) Function ISHOSTED( ) Function LIST OBJECTS Command LOADPICTURE( ) Function MODIFY CLASS Command NEWOBJECT( ) Function NewObject Method RELEASE CLASSLIB Command REMOVE CLASS Command RENAME CLASS Command SAVEPICTURE( ) Function _SCREEN System Memory Variable SET CLASSLIB Command SET OLEOBJECT Command WITH... ENDWITH Command Список команд и функций, связанных с ООП
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.