Классы-расширения. 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 определены базовые методы для работы с объектами-расширениями и доступные для работы из вашего класса-расширения по умолчанию. Для вывода данных объекта-расширения совместно с мастер-объектом рекомендуется создавать отдельную выборку в классе-расширении, в которую выводить все требуемые атрибуты(так же, при необходимости, на эту выборку можно добавлять атрибуты мастер-объекта), после чего прикреплять эту выборку к выборке мастер-объекта, используя настройку на типе объекта, регистрируя из модуля в котором создано расширение, закладку на тип(ы) мастер-объекта, либо используя схожий подход для возможности динамической настройки детализации выборок мастер-объекта без использования настроек на типе объекта(например при отсутствии такого атрибута у мастера).