В любом классе могут быть объявлены объекты другого класса точно так же, как, например, можно в классе объявлять переменные простых типов, массивы простых типов и т. п. В AnyLogic включение в активный объект экземпляров уже построенных активных объектов позволяет строить иерархию объектов любой сложности и любой необходимой глубины.
На рис. 7.9 определены следующие классы активных объектов:
- класс Memory, содержащий только одну переменную date;
- класс world, содержащий переменную population и статический таймер
update;
- класс Agent, в который включены параметр р, переменная age, стейтчарт с именем life, а также один экземпляр класса Memory с именем memory;
- корневой класс Model, в который включены как объект world — экземпляр класса world, так и реплицированный (размноженный) объект agent — динамический массив из нескольких агентов, экземпляров класса Agent. Динамические массивы активных объектов представлены в AnyLogic вектором.
Как говорилось ранее, классы — это, фактически, типы, шаблоны сложных объектов. Сам объект определенного типа строится только при его объяле-нии с указанием типа. В AnyLogic экземпляр активного объекта строится автоматически, как только название класса активного объекта из окна проекта переносится мышью в поле редактора создаваемого активного объекта., причем ему сразу присваивается имя, которое может быть изменено разработчиком.
Имя экземпляра включенного объекта записывается с маленькой буквы автоматически, в соответствии с упомянутым ранее соглашением об именах классов и объектах-экземплярах классов.
Например, чтобы включить в активный объект а один экземпляр объявленного ранее типа в, нужно мышью перетащить в поле редактора активного объекта а активный объект в из окна проекта. Новый экземпляр автоматически получит имя b. Можно включить в а несколько экземпляров активных объектов класса в, перетащив явно в класс а активный объект
в несколько раз. Все эти экземпляры получат различные имена, и ко всем ним можно обращаться по их уникальным именам.
Другой вариант размножения включенных в класс а экземпляров активного объекта в — это использование операции репликации (размножения). Для того чтобы размножить экземпляр объекта в, включенный в класс активного объекта а, нужно указать в поле Кол-во объектов вкладки Количество окна свойств объекта ь их количество как целую величину. При этом у имени данного объекта в поле редактора появляется звездочка (*). Все эти объекты представляются в AnyLogic вектором с одним именем, к ним применены все операции над векторами. Если реплицированный экземпляр активного объекта имеет имя ь, то к отдельным его элементам можно обратиться так: b.item(0), b.item(1) и т. д. Обычно такие реплицированные активные объекты являются динамическими, в них можно добавлять и из них можно выбрасывать некоторые или даже все объекты. Мы рассмотрим операции над реплицированными объектами далее. На рис. 7.9 из экземпляров класса Agent построен реплицированный объект с именем agent.
Иерархия объектов, схематично показанная на рис. 7.9, при разработке модели на AnyLogic строится совершенно естественно. Рисунок 7.10 показывает модель, названную пример, с такой иерархией. В этой модели корневой активный объект назван Model. Здесь определено несколько классов активных объектов, все это шаблоны активных объектов, экземпляры которых могут быть включены в другие классы активных объектов. Например, здесь определен новый класс активного объекта Memory с одной переменной date; новый класс активного объекта Agent, в который включены один экземпляр класса Memory с именем memory, переменная age и стейтчарт с именем life и т. д.
Наследование классов
Наследование — одна из главных концепций объектно-ориентированной разработки, оно позволяет создавать иерархию классификации. При разработке программной системы сначала создается главный класс, который определяет свойства, общие для некоторого множества объектов. Назовем этот класс базовым. Затем можно построить наследуемый класс, который унаследует все свойства (параметры и методы) базового класса, и в него можно добавить свои, дополнительные свойства (данные и методы), которые будут характеризовать подмножество этого множества объектов. Класс, который наследуется от базового класса, называется подклассом этого базового класса. От одного базового класса можно наследовать несколько подклассов Кроме того, сам подкласс может служить базовым классом для любого числа новых подклассов, являясь для них базовым классом.
В AnyLogic наследование применяется очень широко. Фактически, среда разработки моделей AnyLogic содержит много заранее определенных базовых классов со своими свойствами и возможностями, а разработчик модели с помощью введения в эти базовые классы дополнительных данных и функций создает свои подклассы. Наследуемые объекты нуждаются в определении только тех качеств, которые являются дополнительными по отношению к объектам базового класса. Например, Активный объект — это базовый класс, определенный в AnyLogic. Разработчик модели строит свой класс активного Объекта, КОТОРЫЙ ЯВЛЯеТСЯ ПОДКЛаССОМ баЗОВОГО Класса Активней
объект, введением в класс активный объект дополнительных объектов, пе-ременных и функций. Все классы активных объектов, определенные в модели,
являются различными классами языка Java, подклассами базового класса
ActiveObject.
Все классы, наследованные от одного базового класса, составляют иерархическую структуру, которую можно изобразить деревом. С точки зрения наследования все активные объекты, определенные в модели на AnyLogic, находятся на одном и том же уровне иерархии.
Пример дерева наследования классов представлен на рис. 7.11 для модели пример, имеющей структуру, показанную на рис. 7.9. Реальное дерево классов
|
модели значительно больше, здесь, например, не показаны классы стейтчарта и таймера, которые также наследуются от базового класса
Object. Окно проекта Проект, находящееся в левой части окна редактора
AnyLogic на рис. 7.10, показывает список активных объектов, из которых строится модель.