Brief: расширения
Расширение классов
Инструкция EXTEND CLASS донаследует уже объявленный класс от новых родительских классов и добавляет ему новые статические объекты.
Структурно это выносит связи между классами в отдельный модуль: базовый модуль объявляет класс, зависящий от него модуль добавляет родителя, ничего в базовом не меняя. Механизм — расширение классов.
CLASS Box : Shape;
CLASS Quadrilateral;
EXTEND CLASS Box : Quadrilateral; // добавляем наследование
EXTEND CLASS ShapeType { // добавляем статический объект
circle 'Окружность'
}
Расширение свойств и действий
Абстрактное свойство или действие — объявленная точка расширения: базовый модуль оператором ABSTRACT задаёт контракт — классы параметров, вид выбора реализации и класс результата, который у свойства есть всегда, а у действия — только если оператор его назвал, — а другие модули добавляют реализации инструкцией += для свойств и инструкцией ACTION+ для действий. Виды выбора и опции — в Brief: свойства.
Структурно это отложенная сборка обычного оператора: для свойства — оператора выбора, для действия — оператора ветвления или последовательности. Реализации хранятся упорядоченным списком, и новая добавляется в его начало или конец.
Отсюда основной приём модульности: базовый модуль объявляет точку расширения, зависящие от него модули добавляют поведение, и обратной зависимости не возникает.
Расширение форм
Инструкция EXTEND FORM дополняет форму, объявленную в другом модуле, — теми же блоками, что и объявление FORM (см. Brief: формы): объекты, отображаемые свойства и действия, фильтры, сортировки. Отдельные блоки расширения меняют элементы, уже добавленные на форму; дизайн формы тоже настраивается извне.
Добавляемый элемент можно поставить до или после конкретного элемента формы либо в начало или в конец; для объектов эта позиция задаёт их место в порядке групп объектов, от которого зависят группа отображения свойства и группа объектов для фильтра. Механизм — расширение форм.
EXTEND FORM items
PROPERTIES(i) NEWSESSION DELETE // кнопка удаления
OBJECTS g = ItemGroup BEFORE i // группа товаров перед товаром
PROPERTIES(g) READONLY name
FILTERS itemGroup(i) = g
;
Отдельной логики расширения для навигатора и дизайна формы нет: эти конструкции расширяемы по определению (расширения).