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

В приведенном ниже разделе описывается, каким образом вы можете переписать или исполнить метод или код события из родительского класса:

Перепись кода родительского класса

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

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

Например, приведенный ниже программный код использует ключевое слово NODEFAULT событии KeyPress textbox'а для предотвращения печати символов от их отображения в text box'е:

  CopyCode image Скопировать код
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 имеется приведенный ниже код:

  CopyCode imageСкопировать код
GO BOTTOM
THISFORM.Refresh

Этот код смещает указатель записи таблицы в конец таблицы. Когда вы создаете командную кнопку, например, cmdGoBottom1, основанную на классе cmdGoBottom и добавляете ее в форме, вы можете рещить исполнять код родительского класса в событии Click и отображать сообщение, указывюще на то, что указатель записи таблицы перемещен в конец таблицы. Предположим, что вы добавляете только приведенную ниже строку кода в код события Click командной кнопки cmdGoBottom1 для отображения сообщения: "At the Bottom of the Table":

  CopyCode imageСкопировать код
WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1

Когда вы запустите форму, сообщение отображается; однако, указатель записи не смещается, так как код в событии Click командной кнопки cmdGoBottom1 переписал код родительского класса. Для того, чтобы гарантировать, что код родительского класса для события Click также будет исполнен, включите приведенные ниже строки кода, вместо кода в событии Click:

  CopyCode imageСкопировать код
DODEFAULT( )
WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1

Приведенные ниже строки в коде Click той же самой кнопки, показывают, как выполнить ту жу самую задачу с помощью оператора (::) и имени родительского класса:

  CopyCode imageСкопировать код
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, используя приведенный ниже код примера:

  CopyCode imageСкопировать код
IF USED( ) AND CURSORGETPROP("Buffering") != 1
TABLEREVERT(.T.)
ENDIF
DODEFAULT( )

Код, добавленный в класс cmdCancel, сбрасывает изменения с помощью функции TABLEREVERT( ) до использования функции DODEFAULT( ) для вызова кода в классе cmdOK с целью высвобождения формы.

ЗамечаниеЗамечание

Вам нет необходимости добавлять функцию TABLEUPDATE( ) в класс cmdOK, так как изменения, сделанные в буфферированной таблице записываются, по умолчанию, при закрытии формы.

Для получения более подробной информации, смотрите описание функции DODEFAULT() и описание :: Scope Resolution Operator.

Смотрите также