Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [ 35 ] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

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

Полиморфизм обеспечивает общий интерфейс для работы с создаваемыми объектами. Например, вызов метода Draw для объектов Box1 и Box2 может вызвать совершенно различные последствия, так как каждый из этих объектов может иметь собственный метод Draw. Для программиста полиморфизм обеспечивает более простое и гибкое управление для группы связанных объектов.

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

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

В обращении имя объекта отделяется специальным оператором - точкой (.). Например, если надо сделать недоступным объект - список с именем MyList, необходимо выполнить команду:

MyList.Enabled = .F.

Это вызовет изменение свойства, контролирующего доступность данного объекта для работы с ним пользователя. Список изменит свой внешний вид и для возвращение его в рабочее состояние нужна команда: MyList.Enabled = .T.

Обращение к объекту для выполнения каких-либо действий аналогично обращению для изменения его свойств. После имени объекта мы должны указать имя метода: MyList.Refresh()

В некоторых ситуациях мы не сможем прямо обратиться к интересующему нас объекту. Например, если мы захотим обратиться к упомянутому выше списку из другой формы, то должны будем послать наше обращение не списку, а форме, содержащей нужный список: MyForm.MyList.Enabled = .T.

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

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

• THIS - позволяет сослаться на текущий объект;

• THISFORM - позволяет сослаться на текущую форму;

• THISFORMSET - позволяет сослаться на текущий набор форм.

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

5.2.

Таблица 5.2. Обращение к объектам с помощью относительной адресации Источник обращения Пример

обращения к объекту MyObject

Другой метод того же самого THIS.Enabled = .T.

объекта

Форма, включающая объект THIS.MyObject.Enabled = .T.

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



Другой объект той же самой THISFORM.MyObject.Enabled

формы = .T.

Извне формы MyForm.MyObject.Enabled =

Объект другой формы, THISFORMSET.MyForm.

входящей в один набор форм MyObject.Enabled = .T.

Извне набора форм MyFormSet.MyForm.

MyObject.Enabled =.T.

В Visual FoxPro и Visual Basic есть два свойства, которые позволяют выполнять действия относительно активного объекта, то есть объекта, с которым в данный момент работает пользователь (на который указывает курсор), без необходимости знания его имени. Свойство ActiveForm формы или набора форм имеет следующий синтаксис: FormSet.ActiveForm.Property [= Setting]

FormSet.ActiveForm.Method

Это свойство позволяет узнать заданное в Property свойство для активной формы или выполнить указанный в Method метод. Если мы задаем параметр Setting, то указанное значение сравнивается с установленным, и в случае равенства возвращается .T. Если Setting не указывается, возвращается установленное значение свойства Property.

Если мы не используем набор форм, то на месте FormSet в Visual FoxPro мы должны сослаться на экранный объект с помощью системной переменной SCREEN. Эта системная переменная выполняет в таком случае несколько нестандартные для системных переменных в Visual FoxPro функции. Она играет роль ссылки на главное окно Visual FoxPro, позволяя управлять им как объектом. Например, для очистки главного окна Visual FoxPro от выведенных данных можно в окне Command написать команду CLEAR. Тот же самый результат будет достигнут, если мы напишем следующую строку:

SCREEN.Cls

В Visual Basic с этой же целью используется объект Screen. Например: Screen.ActiveForm.MousePointer = 4

Свойство ActiveControl позволяет сослаться на активный объект формы, страницы в многостраничной форме или панели инструментов. Синтаксис этого свойства следующий: Ой/ect.ActiveControl.Property [= Setting]

Если во время работы с формой мы в окне Debug наберем приведенную ниже строчку и будем перемещаться между разными элементами управления, то увидим имя активного в данный момент элемента управления: SCREEN.ActiveForm.ActiveControl.Name

В связи с тем, что объектная модель Visual FoxPro поддерживает наследование, при работе с классами не обойтись без соответствующей информационной поддержки. Для получения информации о созданных объектах можно воспользоваться следующими свойствами. Эти свойства имеют статус "только для чтения" и не могут использоваться для изменения свойств объекта. Object.BaseClass

Возвращает имя базового класса, на основе которого создан указанный объект. Ой/ect.Class

Возвращает имя класса. Object.ClassLibrary

Возвращает имя файла пользовательской библиотеки классов, в которой содержится определение класса, на основе которого создан объект. Object.ParentClass

Возвращает имя класса, который является родительским для класса, на основе которого создан указанный объект. Control.Parent

Обеспечивает ссылку на содержащий элемент управления объект-контейнер. Например, мы можем изменить цвет фона формы при каких-либо действиях с включенным в нее элементом управления без необходимости знать имя этой формы: THIS.Parent.BackColor = RGB(192,0,0)

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

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

Object.Comment [ = cExpression]

Это свойство удобно использовать для дополнительной идентификации объектов, если нет



необходимости изменять установленные идентификаторы, доступные для СУБД.

Записать какие-либо данные для объекта можно с помощью еще одного свойства Object.Tag [ = Expression]

Оба перечисленных выше свойства по умолчанию, если им не присвоены какие-либо значения, возвращают пустую символьную строку.

Для работы с классами и созданными на их основе объектами из программы в Visual FoxPro существует несколько очень важных команд и функций, которые мы и рассмотрим. Мы советуем вам максимально использовать возможности визуальной работы с классами и объектами, которые описаны в главе 10. В то же время мы сознательно уделяем этим командам и функциям столько внимания при описании объектной модели даже несмотря на то, что этот материал имеет специфическое отношение только к Visual FoxPro, так как если вы внимательно разберете приведенные здесь примеры, то в дальнейшем будете уверенно ориентироваться среди рассматриваемых в этом параграфе сложных понятий ООП.

ADD CLASS ClassName [OF ClassLibraryNamel] TO ClassLibraryName2 [OVERWRITE]

Добавляет описание класса в визуальную библиотеку классов. Параметр Class-Name определяет имя класса, добавляемого в визуальную библиотеку классов ClassLibraryName2. Если файл визуальной библиотеки классов не существует, Visual FoxPro создает визуальную библиотеку классов и добавляет в нее определение класса. Если вы опускаете необязательную опцию OF ClassLibraryNamel, Visual FoxPro ищет описание класса в любых визуальных библиотеках классов, открытых командой SET CLASSLIB. Visual FoxPro сгенерирует ошибку, если определение класса не может быть размещено или определение класса с именем, которое вы задаете, уже существует в ClassLibraryName2. Опция OF ClassLibraryNamel определяет визуальную библиотеку классов, из которой копируется определение класса. Опция OVERWRITE удаляет все классовые определения из визуальной библиотеки классов прежде, чем определение нового класса будет добавлено.

Использование команды ADD CLASS добавляет определение класса в библиотеку классов или копирует определение класса из одной визуальной библиотеки классов в другую. Определение класса не может быть добавлено из программы, процедурного файла или приложения Visual FoxPro (файлы с расширениями PRG или APP).

DEFINE CLASS ClassNamel AS ParentClass [[PROTECTED Propertyl, Property2 ...]

Property = Expression...] [ADD OBJECT [PROTECTED] Object AS ClassName2 [NOINIT]

[WITH cPropertylist] ]... [[PROTECTED] FUNCTION PROCEDURE Name

[NODEFAULT]

cStatements

[ENDFUNC ENDPROC]]...

ENDDEFINE

Создает определяемый пользователем класс или подкласс и задает свойства, события и методы для класса или подкласса. Параметр ClassNamel определяет имя создаваемого класса.

ОпцияAS ParentClass определяет родительский класс, на котором будет основан создаваемый класс или подкласс. Родительским классом может быть базовый класс Visual FoxPro, такой, например, как Form или любой другой определяемый пользователем класс или подкласс. Невизуальный определяемый пользователем класс может быть создан определением имени Custom для ParentClass.

С помощью опции [PROTECTED Propertyl, Property2 ...] Property = Expression... можно назначить свойства создаваемому классу и установить для них значения, которые будут использоваться по умолчанию. Знак равенства говорит о том, что свойству PropertyName присваивается значение выражения Expression. Чтобы предотвратить доступ и изменение значений свойств вне определения класса или подкласса, включайте опцию PROTECTED и список защищенных свойств. Методы и события внутри определения класса или подкласса могут обращаться к защищенным свойствам.

Опция ADD OBJECT позволяет добавить объект к определению класса или подкласса из базового класса Visual FoxPro, определяемого пользователем класса или подкласса, либо из класса OLE. Параметр Object определяет имя объекта и используется для ссылки на объект изнутри определения класса или подкласса после его создания. Параметр ClassName определяет имя класса или подкласса, содержащего объект, который вы добавляете к определению класса. Опция NOINIT указывает на то, что метод Init не выполняется при добавлении объекта.

Опция WITH cPropertyList определяет список свойств и значений свойств объекта, который вы добавляете к определению класса или подкласса.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [ 35 ] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146