Когда вы создаете класс, то класс автоматически наследует все свойства, методы и события родительского класса. Например, если в родительском классе существует код для события, то этот код исполняется, когда происходит событие в объекте, основанное на субклассе, созданном из родительского класса.
В приведенном ниже разделе описывается, каким образом вы можете переписать или исполнить метод или код события из родительского класса:
Перепись кода родительского класса
Обычно, создание нового класса вызывается желанием придать дополнительную функциональность объекту, созданного из этого класса, по сравнению с оригинальным классом. Однако, вы можете переписать код метода или события, наследуемого из родительского класса. Например, предположим, что вы создаете субкласс или объект, основанный на субклассе контнейнера, такого как форма. Вы можете написать новый код для события Click класса, для того, чтобы переписать код события родительского класса. В обоих случаях, в run time будет исполнено новый, а не оригинальный код.
Вы можете, кроме того, предотвратить поведение по умолчанию базового класса, которое определяется методами или событиями субкласса. Для этого, вам нужно в добавляемый код метода или события включить ключевое слово NODEFAULT.
Например, приведенный ниже программный код использует ключевое слово NODEFAULT событии KeyPress textbox'а для предотвращения печати символов от их отображения в text box'е:
![]() | |
---|---|
frmKeyExample = CREATEOBJECT("test") frmKeyExample.Show READ EVENTS DEFINE CLASS myForm AS FORM ADD OBJECT text1 AS TEXTBOX PROCEDURE text1.KeyPress PARAMETERS nKeyCode, nShiftAltCtrl NODEFAULT IF BETWEEN(nKeyCode, 65, 122) && Между 'A' и 'z' This.Value = ALLTRIM(This.Value) + "*" ACTIVATE SCREEN && Направляет вывод в гланое окно Visual FoxPro. ?? CHR(nKeyCode) ENDIF ENDPROC PROCEDURE Destroy CLEAR EVENTS ENDPROC ENDDEFINE |
Вызов кода родительского класса
Вы можете оптимизировать дизайн класса ввдением и испольнением кода на различных уровнях иерархии класса или контейнера.
Для исполнения метода или кода события в родителском классе в дополнении к коду того же самого метода или события в субклассе введите в код функцию DODEFAULT( ) или оператор (::) до написанного вами кода метода или события.
![]() |
---|
При использовании функции DODEFAULT() вам не требуется знать имя родительского класса. Однако, для определения всех классов в иерархии класса объекта, используйте функцию ACLASS(). Для получения более подробной информации, смотрите ее описание в ACLASS(). |
Например, предположим, что у вас имеется класс с именем cmdGoBottom, основанный на классе CommandButton, у которого в событии Click имеется приведенный ниже код:
![]() | |
---|---|
GO BOTTOM THISFORM.Refresh |
Этот код смещает указатель записи таблицы в конец таблицы. Когда вы создаете командную кнопку, например, cmdGoBottom1, основанную на классе cmdGoBottom и добавляете ее в форме, вы можете рещить исполнять код родительского класса в событии Click и отображать сообщение, указывюще на то, что указатель записи таблицы перемещен в конец таблицы. Предположим, что вы добавляете только приведенную ниже строку кода в код события Click командной кнопки cmdGoBottom1 для отображения сообщения: "At the Bottom of the Table":
![]() | |
---|---|
WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1 |
Когда вы запустите форму, сообщение отображается; однако, указатель записи не смещается, так как код в событии Click командной кнопки cmdGoBottom1 переписал код родительского класса. Для того, чтобы гарантировать, что код родительского класса для события Click также будет исполнен, включите приведенные ниже строки кода, вместо кода в событии Click:
![]() | |
---|---|
DODEFAULT( ) WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1 |
Приведенные ниже строки в коде Click той же самой кнопки, показывают, как выполнить ту жу самую задачу с помощью оператора (::) и имени родительского класса:
![]() | |
---|---|
cmdGoBottom::Click() WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1 |
Как другой пример этого, библиотека визуальных классов Buttons.vcx, находящаяся в каталоге Visual FoxPro ...\Samples\Classes содержит два класса командных кнопок: cmdOK и cmdCancel. Предположим, что на форме имеется командная кнопка, созданная из класса cmdOK. Код в ее событии Click освобождает форму, когда вы щелкаете по этой командной кнопке. Однако, класс командной кнопки cmdCancel является субклассов командной кнопки cmdOK. Предположим, что вы желаете сбросить изменения, сделанные а таблице, когда вы щелкаете по командной кнопке, созданной из класса cmdCancel. Вы можете добавить желаемую функциональность событию Click класса cmdCancel, который вызывает код метода в классе cmdOK, используя приведенный ниже код примера:
![]() | |
---|---|
IF USED( ) AND CURSORGETPROP("Buffering") != 1 TABLEREVERT(.T.) ENDIF DODEFAULT( ) |
Код, добавленный в класс cmdCancel, сбрасывает изменения с помощью функции TABLEREVERT( ) до использования функции DODEFAULT( ) для вызова кода в классе cmdOK с целью высвобождения формы.
![]() |
---|
Вам нет необходимости добавлять функцию TABLEUPDATE( ) в класс cmdOK, так как изменения, сделанные в буфферированной таблице записываются, по умолчанию, при закрытии формы. |
Для получения более подробной информации, смотрите описание функции DODEFAULT() и описание :: Scope Resolution Operator.