Ю. Карпов - Иммитационное моделирование систем с AnyLogic 5 (1124147), страница 31
Текст из файла (страница 31)
Рассмотрим, как можно обратиться к различным обьектам модели из объекта хоос, если его структура определена рис. 7.9 и 7.12. Объект косе содержит Глава 7. Сведения о языие )ауа, необходимые для разработки моделей ко Длу( одс (б( реплицированное включение (набор) из 5 экземпляров класса лдепп, к ним можно обратиться по номеру так: адове.ъеее(о), адепе, 'петп(1), аде е.геетп(а). Заметьте, что последний элемент набора имеет номер, на 1 меньший количества элементов в наборе. Например, можно записать в объекте тооп следующее присваивание: адепе,ьееп~(З).аде = 5бп К объекту еепюту четвертого агента в списке можно обратиться так: адепе. зпеап (3 ) .ппепюту; а переменной папе объекта тпе(поту можно присвоить конкретное значение из объекта топе так: адепе.ьпепп(3).еепюпу.даве = 1974; Во многих моделях количество экземпляров активных объектов, объявленных как реплицированный обьект, может динамически изменяться.
Текущее количество объектов в векторе реплицированных объектов можно получить, обратившись к функции язве(), которая является методом класса уеоеою Таким образом, адепе.яьве() — это число агентов в векторе, и к объекту еепюту последнего агента массива можно обратиться так: адепе.веет( адепе.
язве( ) -1 ).тпепоту Привелем несколько полезных функций лля работы с реплицированными активными объектами, число элементов которых динамически меняется. Пусть этот реплицированный объект называется адепе. П Обращение к случайному элементу вектора агентов из включающего активного объекта: адепс.папоое! ) П Добавление нового элемента к массиву: ветер адепе( пеи лдепп( ), 1 ) Здесь лдепе — это имя класса активных объектов, реплицированный набор экземпляров которого назван именем адове (можно узнать в функции хдепе () конструктор класса лдепе, 1 — это номер, с которым объект вставляется в список). Если объект вставляется в список последним, то можно вызвать эту функция) так: вепир адепе( пеи Адепе( ), адепп.яхве( ) ) П Уничтожение элемента массива: п)гврове адове( <удаляемый ялемене массива адепг> ) Отметим, что при использовании динамических массивов активных объектов, когда объекты могут порождаться и исключаться в процессе работы модели, любой просмотр всех элементов массива должен выполняться с использованием метода я' ееы.
который возвращает текущее значение размера вектора агентов. и зэк. 4248 Часть!I. Средства длуьодГс для имитационного моделирования систем 7.7. Доступ к объектам модели по иерархии ее структуры В модели на Апу1оя(с из любого активного объекта можно обратиться к любому другому объекту модели. Рассмотрим технику такого доступа подробнее. 7,7.1. Доступ к переменным и параметрам объектов класса Некоторая трудность в понимании того, как организовать обрагцение к одним обьектам модели из других объектов, состоит в том, что такое обращение будет выполняться по структуре объектов работаюшей модели, а код такого обрашения нужно писать в процессе построения модели, когда разработчик определяет классы активных обьектов.
Поэтому уже при построении модели разработчик должен иметь некоторое представление о будушей структуре модели. Кроме корневого объекта с предопределенным именем тоос, который является единственным экземпляром корневого класса, все другие классы активных объектов будут представлены в работающей модели одним или несколькими экземплярами, включенными в другие экземпляры активных объектов. Окно гоо1 рис. 7.12 показывает, что из объекта хоос доступны абсолютно все обьекты модели, являюшиеся экземплярами других классов.
Например, к объекту иоты можно из объекта тоос обратиться просто иоты, к таймеру сгхгаса объекта иох16 так: иох16.ироасе, к переменной рори1асгоп объекта иох10 так: иот16. рори1асьоп, нап1зимер: х иот1о.роро1аг готц Очевидно, что для того, чтобы этот код выполнялся в обьекте тоос, он дол- жЕН бЫтЬ ОПрсдЕЛЕН В КЛаССЕ Моаа1. Зтс, КОНЕЧНО, СПраВЕЛЛИВО дЛя ОбраШЕ- ния к любому объекту, включенному в данный объект.
Например, из класса хдалс можно обратиться для чглания значений переменных включенного в него экземпляра класса иа оту, например: аде = достав( ) — тпепату.дасе; Изменение переменных и параметров внутри обьекта, вложенного в данный класс, тоже возможно, например (см.
рис. 7.12) из корневого объекта мог1в1 можно изменить переменную: иат16.рори1асъоо = 10000т Такое присваивание вызовет изменение значения в поле памяти, отведенном для этой переменной, и далее будет использовано ее новое значение. Если же эта переменная включена в гард (дивта, защиту) перехода из некоторого состояния стейтчарта, то в момент модификации переменной все Глава 7. Сведения о языке.1ие, неосходимыедля рвзрагкяки моделей на Дпу(оус (53 условия, содержащие ее, будут пересчитываться, только если вслед за моди- фикацией переменной выполнить функцию весмоцьг)еа(). Методы ве$ РагатОи опСЬапде РаттО Похожая ситуация с изменением параметров экземпляров активных объектов.
Параметры экземпляров активного обьекта устанавливаются при порождении этих объектов, например, при включении экземпляра активного объекта в качестве элемента в другой активный объект. В некоторых случаях параметры объекта необходимо изменять в процессе работы модели. К параметру объекта, как и к любой переменной объекта, можно обратиться по имени и изменить его. Если параметр ввхвв объекта изменяется простым присваиванием, то это вызовет только изменение значения в поле памяти, отведенном для этого параметра. Во многих ситуациях, однако, изменение параметра должно влиять на функционирование объекта или даже на его структуру, если имя данного параметра используется, например, при инициализации обьекта. В Апу) ой)с в этом случае можно использовать следующий прием.
Значение параметра яехев объекта можно устанавливать не простым присваиванием, а вызывая функцию вег ввхв к(р) у этого объекта. В результате выполнения этой функции, во-первых, значение параметра вехеж станет равным р, и, во-вторых, после этого в объекте будет вызвана функция опсьесяе гехах (), которую разработчик может определить так, как этого требует логика функционирования модели. Если функция сссьесяе вехмв() не определена в классе, экземпляром которого является объект, то результатом выполнения функции вес ье.ат(р) будет простое присваивание. 7.7.2. Доступ к переменным и объектам включающего объекта.
Функция де$0и)пегО Новые классы в языке Заха могут быть определены лвумя различными способами. Первый — это независимое определение, когда при определении одних классов в их теле могут использоваться только экземпляры других классов. В Апу) оя)с новые классы пктиеных объектов опрелеляются с помощью визуальных средств и включений фрагментов программного кода именно так: в проекте объявляется новый класс активного объекта, в данный класс добавляются свои переменные, методы и т.
п, Именно это представлено на рис. 7.)2, где классы мосе1, иохы, не охи и ляесс определяются независимо. Экземпляры так определенных активных объектов могут быть включены в любые другие классы активных объектов (конечно, с соблюдением правил иерархии: построенная структура экземпляров активных Часть Ф. Средства Апу1од(с для имитационного моделирования систем объектов должна быть деревом), поскольку все независимо опрелеленные классы "видят" друг друга.
Пусть необходимо получить доступ из любого обьекта адепс класса вдевай К ПЕрЕМЕННОй х ТОГО Кдаееа Моае1, КстОрмй ВПОСЛЕдотанн ВКЛЮЧИТ ЛаННЫй объект. Для этого в классе лдепс нужно получить указатель на объект, который будет включать объект адепп. Если такой указателыа получен, появляется возможность доступа из объекта адепт к любому объекту (например, к переменной х) во вкл)очаюшем его классе (как .х). В классе лдепт. выполним следующее: Е Объявим в классе лдепп новую переменную (назовем ее и) типа моае1 и инициализируем ее так, чтобы она указыва)а на "владельца" обьекта: Моое1 та = (Моде1)депсипет( 2.
Для установки значения переменной х класса мос)е1 обратимся к ней так: т.х = 1; Функция десоипет дает в результате владельца данного объекта, но тип результата нужно явно привести к типу класса-владельца, лля чего используется явная конверсия типов. В нашем примере зто класс моае1. После этого мы получаем возможность обратиться к любому объекту в классе ноае1. Рассмотрим другой пример. Пусть определен класс лдепс, набор экземпляров которого (реплицированный объект) с именем адепт будет впоследствии ВКЛЮЧЕН В КЛаСС Мос)е1. В КЛаССЕ Лдепп МОЖНО ВЫПОЛНИТЬ СЛЕдуЮщИЕ ОПЕрации, которые будут выполняться в каждом экземпляре этого класса. вклю- ЧЕННОМ В ~ля~~ Мскте1: О определить указатель на включающий объект: Моое1 та = (Моое1)деооипет(); О определить число экземпляров в массиве вдеты 1пе Н = т.адепп.в1ве()т О послать событие "до" стейтчарту агента с номером 0: та.адепс.1сета(0).всасес)тат(.а1хеввепо("до") О определить номер данною экземпляра в наборе адепы ъпс 1=део1пс)ех()) 7.7.3.
Ключевое слово И~в Новый класс можно также определить внутри друп)го класса. Такое определение называется вложенным. В АпуЕоя(с новые классы некоторых объектов, таких, как таймер, стейтчарт, анимация и т. и., опрелеляются именно так. Для того чтобы из обьектов этих типов обратиться к переменным или пара- МЕтраМ КЛаееа, ИХ ВКЛ(ОЧаЮШЕГО, ИСПОЛЬЗустСя КЛЮЧЕВОЕ СЛОВО ПИ1в. Зтс Глава 7. Сведения о язв(ие )аза, необходиьье для разработки мс)делей на А)фоус 155 слово применяется всегда, когда у метода возникает необходимость обратиться к обьекту, который его вызвал. Можно считать, что любой класс содержит переменну)о с именем сь).а, имеющую тип топ) объекта, в котором она находится, и указывавшую на данный объект. Поэтому, например, если из стейтчарта щге, являющегося объектом кчасса лдепс, необходимо обратиться к включающему этот стейтчарт объекту, то нужно записать лдепс.сьхе. Если в стейтчарте использовать просто слово сньа, то мы получим обращение к самому стейтчарту.
Приведем пример использования этого ключевого слова. Пусть, например, при наступлении некоторого события необходимо удалить данного агента, например, если закончилось определенное лля него время жизни. Для этого нужно во включающем классе вызвать функци)о: с(дароае адепп( лдепп.слве ); Это приведет к удалению экземпляра класса лдепс, в котором эта функция вызвана. 7.7.4. Примеры Приведем примеры решения некоторых проблем доступа лля структуры объектов молели, представленной на рис. 7.!2.