2014-10-17 3 views
0

Я создаю AnyLogic Agent, который я хотел бы часто повторно использовать. Во многих агентах и ​​компонентах AnyLogic существуют пробелы, в которых вы можете вводить код типа «on receive» или «Action» или «body function». Они скомпилированы в Агент при построении модели. Как это делает средний программист?Как создать агент с параметром «код» в AnyLogic?

Например, предположим, что у меня есть этот агент (псевдокод, очевидно):

Button extends Agent 
    name : Parameter // A normal parameter for recording the button's name. 
    color : Parameter // A normal parameter for recording the button's color. 
    onPress : <code> // User-provided code that is executed when the button is pressed. 

Клиент может использовать его следующим образом:

userButton7 is a Button 
    name = "Emergency Button" 
    color = Red 
    onPress = { 
    for each Person p in simulation 
     p.tryToEscapeBuilding() 
    } 

Возможно ли это?

ответ

1

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

Но в AnyLogic 7 вы можете визуально визуализировать агента, а затем использовать ограниченную форму наследования для создания подклассов этого Агента. (См AnyLogic справки по Agent наследования по моделированию Агентного.) Наследование ограниченно в том, что:

  • вы можете переопределить/методы перегрузки (функцию) --- то есть, определить один с тем же именем в подклассе --- но вы не можете сделать то же самое для полей (переменные/параметры), даже если они являются частными в суперклассе (так что даже в тех случаях, когда это не будет скрывать/затенять поле в смысле Java);
  • Вы не можете использовать такой агент подкласса в качестве агента верхнего уровня в своей модели.

[спасибо nikolaj за указание, что переопределения функций возможны. Я мог бы поклясться, что попробовал это в исходной версии AnyLogic 7 и имел такое же ограничение, как и для параметров/переменных; возможно, он был изменен в одном из релизов версии 7.0.x?]

Оба они могут быть довольно ограничительными в зависимости от обстоятельств, но в вашем примере это было бы хорошо: иметь агента, который имеет/'is' кнопку (с параметрами AnyLogic для цвета, имени и т. д.).

Обратите внимание, что ваш псевдокод onPress является проблематичным для агента многократного использования, если вы не делаете что-то вроде наличия List<? extends Person> в качестве параметра для вашего Агента (так, чтобы при создании он имел общую ссылку на то, что позволяет ему циклически через агентов с функцией tryToEscapeBuilding).

0

как monsieurRigsby говорит, вы можете создать подкласс класса Agent. , но на самом деле можно переопределить функции. просто напишите: @Override в «Пользовательских модификаторах» функции onPress

+0

Что такое «пользовательский модификатор»? Я никогда не слышал этого термина в отношении AnyLogic. –

+0

А, интересно; Мне нужно играть с этим. (Вы все еще пропустите такие вещи, как абстрактные методы, хотя вы можете приблизиться к нему с помощью метода (функции) суперкласса, который создает исключение, говорящее, что его нужно переопределить.) Я уверен, что вы не можете теневые поля, хотя (это не позволит вам добавлять поля с тем же именем), хотя это в целом менее полезно. –

+0

@monsieurRigsby, я не уверен, что вы подразумеваете под «теневыми полями», но вы можете переопределить: методы, параметры, переменные и т. Д. С тем же именем в суперклассе –