Одновременно с созданием каждого слота, если для него задан соответствующий инициализатор, создается его "начальное" значение:
В качестве инициализатора каждого создаваемого слота используется значение соответствующего аргумента доказываемого конструктора или, если аргумент не задан, инициализатор в определении класса. При этом инициализаторы, заданные в определении любого класса C, отменяют ("перекрывают") все инициализаторы соответствующих атрибутов в определениях предков класса C.
Построение значения слота, инициализатором которого является конструктор, вызывает доказательство этого конструктора.
Если инициализатором слота является конструктор резидента, создается специальная переменная, общая для резидента и его владельца. Эта переменная становится начальным значением слота процесса-владельца, инициализатором которого является названный конструктор резидента.
Если инициализатором слота является конструктор резидента, в составе которого задан некоторый конструктор мира, указанный конструктор мира также доказывается.
Слоты, не имеющие инициализаторов, а также слоты, (взаимно-) рекурсивно заданные в качестве своих собственных инициализаторов, получают в качестве начальных значений уникальные общие переменные.
Все переменные, создаваемые в составе значений слотов, также являются общими.
Если в составе аргумента доказываемого конструктора или в определении соответствующего класса некоторому атрибуту приписан описатель порта, действие описателя распространяется на все общие переменные в составе инициализатора соответствующего слота, исключая конструкторы и вызовы функций, входящие в этот инициализатор.
Описатели портов, заданные в составе конструктора, а также в определении соответствующих классов, перекрывают друг друга аналогично тому, как осуществляется перекрытие инициализаторов слотов. Перекрытие описателей портов происходит независимо от перекрытия инициализаторов слотов.
Рассмотрим определение некоторых классов 'C', 'D' и 'E':
class 'E': suspending: a = 21; protecting: b = 25; [ goal. ] class 'D' specializing 'E': protecting: a = 7; [] class 'C' specializing 'D': b = 8; []В результате доказательства простого конструктора ('C', a=X) будет построен некоторый мир, значения слотов которого a=X, b=8. Переменная X будет объявлена защищающим портом.
Ссылки: атрибут 4.1.1, владелец резидента 5.3, вызов функции 6.2.1, защищающий порт 5.2.2, значение слота 5.1, значение терма 3, инициализатор 4.1.2, класс 4.1, конструктор 4.1.3, конструктор мира 4.1.3, конструктор резидента 4.1.3, мир 5.1, общие переменные 7.2, описатель порта 4.1.1, переменная 2.1.1, порт 5.2.2, построение миров 5.4.1, простой конструктор 4.1.3, резидент 5.3, слот 5.1, терм 3, class 2.1.2, goal 5.4.1, protecting 2.1.2, specializing 2.1.2, suspending 2.1.2.
Следующий:
6. ПРЕДЛОЖЕНИЯ КЛАССОВ
Предыдущий:
5.4.1. ИСПОЛНЕНИЕ КОНСТРУКТОРОВ
5.4. ПОСТРОЕНИЕ ПРОСТРАНСТВА ПОИСКА
КОРНЕВАЯ СТРАНИЦА
ОГЛАВЛЕНИЕ
СПИСОК ПОНЯТИЙ ЯЗЫКА (ИНДЕКС)