В некоторых полях окна свойств объектов модели AnyLogic (и окна Код активных объектов) могут быть указаны действия. Обычно эти действия связаны с событиями, происходящими в модели. Например, поле Действие окна свойств перехода стейтчарта, поля Действие при входе и Действие при выходе каждого состояния стейтчарта, поле Реакция на событие управляющих кнопок и слайдера и т. п. В эти поля может быть помещен один оператор (на-пример, оператор присваивания) или несколько операторов, и после каждого из них, конечно, должна стоять точка с запятой. В это поле может быть помещен и условный оператор или оператор цикла, заканчивающиеся фи-турной скобкой. В таком случае разделитель — точка с запятой — может ине стоять.
Классы и объекты в Any Logic
Классы являются базовыми единицами объектно-ориентированного программирования. В объектно-ориентированном моделировании они форми- I руют определение тех объектов, из которых собирается модель.
Классы и экземпляры классов
Класс в Java формально — это просто средство определения нового типа данных. Класс определяет шаблон, в соответствии с которым будут строиться отдельные представители, или экземпляры этого класса. Экземпляра класса называются также объектами. По принятому в среде программистов соглашению обычно имена классов начинаются с заглавной буквы, а имени объектов (экземпляров классов) — со строчной буквы. (Этого соглашения придерживаются разработчики библиотек классов языка Java в фирме Sun Microsystems.)
Объявление нового класса в Java-программе включает данные и код (методы или функции класса), который оперирует с этими данными. В AnyLogic при построении модели ведение в поле структуры вновь создаваемого активного объекта иконки переменной, введение стейтчартов, объявление арифметической, алгоритмической или табличной функций — это просто возможные способы создания нового класса активного объекта. Вместе с этим можно в окне Код в поле Дополнительный код класса вводить описания новых переменных и методов в нотации Java.
Каждый экземпляр класса содержит свою собственную копию переменных класса, т. е. в каждом объекте эти переменные могут принимать свои значения, и изменения переменных в одном объекте никак не влияют на переменные других объектов этого же класса. Различные экземпляры класса отличаются друг от друга своими параметрами, которые при определении экземпляра класса могут быть явно заданы. Таким образом, мы можем иметь в модели множество однотипных объектов, но с разными параметрами и, следовательно, разным поведением.
Для того чтобы обратиться к переменной var объекта obj из кода, не являющегося частью класса, в котором переменная var определена, нужно использовать "точечную" операцию, т. е. нужно указать имя объекта, в котором переменная или константа объявлена, и за этим именем после точки должно следовать имя переменной: obj.var. Точно так же происходит обращение к методам (функциям) класса. Например, если send () — это метод в объекте port, то обратиться к этому методу извне нужно так: port.send().
Внутри класса, в котором определены метод или переменная, к ним нужно
обращаться непосредственно по имени.
Конструктор класса
При объявлении класса создается только шаблон, никаких объектов-экземпляров данного класса при этом не образуется. Чтобы фактически создать объект-экземпляр данного класса, нужно использовать оператор new с именем этого класса (инициализировать его данные). Соответствующая функция называется конструктором.
Использование конструктора уже встречалось при разработке модели часов clock в главе 6. Генератор тиков в этой модели создавал новое пустое сообщение и отправлял его через свой порт каждый раз, как только срабаты-вал статический таймер. Новое сообщение — это экземпляр уже созданного в AnyLogic класса object, поэтому создание нового сообщения состояло просто в использовании оператора new object(). Посылка созданного сообщения выполнялась следующим оператором: port.send(new Object())
Ясно, что в этом операторе port — имя объекта класса Port (так был назван выходной порт у генератора), a send — имя метода класса Port. Заметьте, что имя класса object начинается с заглавной буквы, а имя объекта port — со строчной буквы (то, что данный объект является экземпляром класса Port, было определено при создании этого объекта).
Если класс имеет параметры, то при создании объектов этого класса конст-руктор может включать параметры. Например, при выполнении оператора:
Color color = new Color(255, 0, 255);
будет порожден новый объект color типа color (пурпурный цвет). Ясно, что
new Color(255, 0, 255)
это конструктор класса Color. Три параметра типа int в вызове этого кон-структора означают, как мы уже знаем, интенсивности трех цветов — крас-ного, зеленого и синего.
Очевидно, что при порождении нового объекта в конструкторе могут использоваться не только константы, но и переменные соответствующих ти-пов. Именно это применялось нами в разд. 7.2.3 при построении модели ColorModel1, когда динамическое значение цвета графического элемента задавалось в зависимости от координаты этого элемента следующим образом: new Color(x, у, В)