Где я, и как мне получить
доступ к…?
В AnyLogic Вы не пишете весь код для Java классов от начала до
конца. Вместо этого Вы вводите небольшие фрагменты кода и выражения в
специальных текстовых полях на страницах свойств различных элементов
модели. Поэтому важно всегда понимать, где именно Вы пишете код в
данный момент (какому классу или методу он принадлежит),
и как получить доступ к другим элементам модели из этого кода.

Большая часть кода, который Вы пишете при разработке модели,
является кодом класса активного объекта, а если быть точнее - кодом
одонго из методов этого класса. Не имеет значения, задаете ли Вы
действие события, инициализируете ли параметр вложенного объекта или
пишете код действия при запуске – считайте, что Вы пишете код для
текущего класса активного объекта. В таком случае будут действовать
следующие правила
(см. рисунок выше):
- Элементы модели, принадлежащие тому же классу активного
объекта, доступны просто по именам (потому что они являются полями того же класса).
Скажем, Вы пишете код в поле свойства Действие события endOfFY
класса активного объекта Company. Чтобы получить доступ к вложенному объекту queue, просто напишите queue.
Чтобы увеличить значение переменной revenue, напишите revenue += amount. А чтобы перезапустить событие endOfFY
из кода его собственного действия - endOfFY.restart(
year() ).
- Чтобы получить доступ к полю вложенного объекта, Вы должны
поставить точку "."
после имени вложенного объекта и затем написать имя этого поля.
Например, чтобы получить размер очереди - объекта queue, нужно написать queue.size(). Если вложенный
объект является реплицированным, то его имя является именем коллекции
объектов, и Вам нужно указать, какой именно объект из этой коллекции
Вам нужен. Чтобы вызвать функцию performance() у элемента под номером 247 из коллекции employees, напишите: employees.get(
246 ).performance().
- Чтобы получить доступ к контейнеру текущего объекта (того объекта, куда вложен текущий), вызовите метод get_<класс объекта контейнера>(). Например, если объект
класса Company вложен
в объект класса Main,
то чтобы получить доступ к объекту Main
из объекта Company, Вы должны написать get_Main().
Поэтому, чтобы вызвать функцию announceSale()
объекта класса Main,
Вам нужно написать get_Main().announceSale(). Также есть функция getOwner(), которая возвращает объект-контейнер, но она возвращает объект типа ActiveObject –
базового класса для Main,
Company и т.д. И перед тем, как осуществлять доступ к принадлежащим классу Main элементам, Вам
нужно будет привести этот объект к классу Main: ((Main)getOwner()).announceSale().
getOwner() полезно использовать в тех случаях, когда мы не знаем о том, в объект какого именно класса вложен текущий объект.
- Чтобы получить доступ к "равному по иерархии" объекту
(объекту, который вложен в тот же контейнер, что и текущий объект),
нужно вначале перейти на уровень выше к контейнеру, а затем спуститься
по иерархии модели вниз, к нужному вложенному объекту. Чтобы получить
значение переменной loyalty определенного элемента реплицированного объекта customers из объекта company (см. рисунок выше), нужно вначале обратиться к объекту класса Main, а затем - к объекту Client (с нужным индексом): get_Main().customers.get(i).loyalty.
- Эти правила естественным образом расширяют иерархическую
структуру модели AnyLogic. Вы можете получить доступ к любому элементу
из любого места модели. Однако мы рекомендуем разрабатывать Ваши модели
по возможности модульным способом, так, чтобы объекты знали минимум
внутренней информации о других объектах, а инициализация и
взаимодействие производились посредством параметров, портов, обмена
сообщениями и вызовов функций с типом доступаpublic.