Специальные методы

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

The _init special method

Метод _init вызывается, когда класс загружен интерпретатором. Он должен объявляться следующим образом :

GB_STATIC_METHOD ( "_init" , NULL , MyClass_init , NULL )

Используйте этот метод для выполнения специфической инициализации класса.

The _exit special method

Метод _exit вызывается, когда класс выгружен интерпретатором. Он должен объявляться следующим образом : 

GB_STATIC_METHOD ( "_exit" , NULL , MyClass_exit , NULL )

Используйте этот метод для выполнения специфической очистки класса. 

The _new special method

Метод _new вызвается, когда новый объект этого класса создан.Он должен объявляться следующим образом : 

GB_METHOD ( "_new" , NULL , MyClass_new , parameters )

Этот метод может получать любые параметры, какие хотите, и ничего не возвращать. Параметры _new придут из параметров оператора NEW .

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

The _free special method

Метод _free вызыватеся, когда новый объект этого класса разрушается (destroyed). Он должен объявляться следующим образом :

GB_METHOD ( "_free" , NULL , MyClass_free , NULL )

Этот метод не принимает параметров и ничего не возвращает.

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

The _next special method

Метод _next вызывается, когда программа Gambas использует инструкцию FOR EACH ... IN для перечисления объекта. Он должен объявляться следующим образом : 

GB_METHOD ( "_next" , return type , MyClass_next , NULL )

Или так :

GB_STATIC_METHOD ( "_next" , return type , MyClass_next , NULL )

Метод не принимает парамтры, но может возвращать перечисленные данные.

Этот метод может быть статическим. Тогда класс будет перечисляемым, но не объект.

Этот метод может ничего не возвращать. Тогда вы будете перечислять объект с помощью инструкции FOR EACH без части IN .

Внутри реализации метода _next вы будете использовать некоторые специфические функции интерфейса программирования Gambas :

GB.GetEnum даст вам указатель на буфер перечисления. Используйте этот буфер для хранения состояния перечисления. Вы можете хранить до 12 байт в этом буфере.

Заметьте, что буфер инициализируется нулями при начале перечисления, так что вы можете обнаружить это особое состояние.

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

The _get special method

Метод _get вызывается, когда [ ] оператор используется на объекте или классе для извлечения данных. Он должен объявляться следующим образом : 

GB_METHOD ( "_get" , return type , MyClass_get , parameters )

Или так :

GB_STATIC_METHOD ( "_get" , return type , MyClass_get , parameters )

Метод может быть статическим. Тогда [ ] оператор будет должен использоваться на классе, не на объекте.

Метод можте принять любые параметры. Эти параметры будут преданы между [ и ] операторами. Например, инструкция Val = MyObject[X, Y] приведет к вызову  _get с X и Y в качестве параметров.

Этот метод должен возвращать данные, извлеченные из объекта или класса.

The _put special method

Метод _put вызывается, когда [ ] оператор используется на объекте или классе для вставки данных в них. Он должен объявляться следующим образом : 

GB_METHOD ( "_put" , NULL , MyClass_put , parameters )

Или так :

GB_STATIC_METHOD ( "_put" , NULL , MyClass_put , parameters )

Метод может быть статическим. Тогда [ ] оператор будет должен использоваться на классе, но не объекте.

Метод может принять любые параметры. Эти параметры будут значением для вставки в объект, и те, что передадутся между [ и ] операторами. Например, инструкция MyObject[X, Y] = Val приведет к вызову _put с Val, X и Y в качестве параметров.

Этот метод ничего не возвращает.

The _call special method

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

GB_METHOD ( "_call" , return type , MyClass_call , parameters )

Или так :

GB_METHOD ( "_call" , return type , MyClass_call , parameters )

Этот метод может быть статическим. Тогда класс будет способен использоваться как функция, но не объект.

Этот метод может принимать любые параметры, и ничего не возвращает.

Класс Message компонента gb.qt - это хороший пример использования этой особенности.

The _unknown special method

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

GB_METHOD ( "_unknown" , "v" , MyClass_unknown , "." )

Этот метод принимает переменное количество аргументов и возвращает значение Variant .

Внутри реализации функции :

Класс Application компонента gb.qt.kde - хороший пример использования этой особенности : когда вы делаете вызов DCOP, интерпретатор не знает, загружено ли приложение, существует ли метод, каковы его параметры и т.д. Так что, специальный метод _unknown , добро пожаловать !