Перейти к основному содержанию
`Ctrl`+`K`

# Классы-расширения. Simple Extensions

## Создание класса-расширения

Класс-расширение создается полностью аналогично любому другому классу. При создании необходимо указать супертип `simpleExtension`.

Либо:

Внимание

Если к классу-расширению предполагается добавлять коллекции, то он не может иметь супертип simpleExtention! В таком случае можно установить ему тип Journal или иной, наиболее подходящий в контексте задачи!

Внимание

Как и у миксинов, у классов-расширений не должно быть собственных id и gid, они ссылаются на gid мастер-объекта при помощи поля gidRef!

Внимание

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

## Создание и удаление объекта класса-расширения

- Объект-расширение тесно связан с мастер-объектом и его жизненным циклом. Жизненный цикл объекта расширения не может выходить за пределы такового у его мастер-объекта, но может быть меньше. Для создания и удаления объекта-расширения требуется создавать точки расширения и добавлять их вызов в нужный момент жизненного цикла мастер-объекта.

- Объект-расширение может быть создан не раньше создания его мастер-объекта. Самый ранний этап жизненного цикла мастера, в который может быть создано расширение - момент создания мастера. Для этого можно использовать уже существующую точку расширения `Btk_Ept#dpiInjectionAfterInsert`. Код этой точки расширения будет вызван сразу же после создания мастер-объекта. Вызов этой точки расширения добавлен во все dpi по умолчанию, поэтому требуется создавать только вторую часть точкирасширения - файл `Ext.scala`.

- Аналогично производится удаление объекта `Btk_Ept#dpiInjectionBeforeDelete` - эта точка расширения вызывается перед удалением мастер-объекта. Её вызов так же доавлен во все dpi по умолчанию.

Внимание

Необходимо учитывать, что эти точки расширения вызываются при создании объектов ЛЮБЫХ классов! Поэтому во второй части точки расширения `dpiInjectionAfterInsert` или `dpiInjectionBeforeDelete` СТРОГО НЕОБХОДИМО проверять к какому классу принадлежит объект мастер-класса, который обрабатывается точкой расширения!

- Инициализация/удаление объекта-расширения происходит только в случае, если класс мастера соответствует классу мастер-объекта, для которого создается расширение.

- Если вам необходимо укоротить жизненный цикл объекта-расширения, например если такой объект может существовать только пока мастер-объекту присвоен определенный тип объекта, тогда необходимо создать свою точку расширения для мастер-объекта, либо воспользоваться уже существующей точкой, предназначенной для создания объектов-расширений, однако с существующими точками стоит быть предельно внимательными и убедиться, что такая точка подходит для вашей задачи! Вызов такой точки расширения происходит из api-сеттера соответствующего атрибута МАСТЕР-ОБЪЕКТА, на который завязан жизненный цикл расширения. Вторая часть точки расширения объявляется соответствующим образом из парного для этой точки файла.

- В случае использования специализированной точки расширения для создания и удаления файлов допускается отсутствие проверки на совпадение классов родительских объектов, в отличие от использования общих точек `Btk_Ept#dpiInjectionAfterInsert` и `Btk_Ept#dpiInjectionBeforeDelete`.

Примечание

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