如何在AnyLogic中使用“代码”参数创建代理?

时间:2014-10-17 21:52:47

标签: anylogic

我正在创建一个我想经常重复使用的AnyLogic代理。在许多AnyLogic代理和组件中,有一些空间可以输入“on receive”或“Action”或“function body”等代码。这些在构建模型时编译到代理中。普通程序员是如何做到的?

例如,假设我有这个代理(显然是伪代码):

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()
  }

这可能吗?

2 个答案:

答案 0 :(得分:1)

你不能编写自己的代理(作为普通的Java类),其中包含AnyLogic模型构建UI中的元素,如果这就是你的意思(另外,如果你编写自己的Java类扩展代理,你有知道用于两个必需构造函数的正确签名,您可以从查看为其他代理生成的代码中看到这些签名。

但是,在AnyLogic 7中,您可以直观地设计代理,然后使用有限形式的继承来创建此代理的子类。 (请参阅基于代理的建模下的代理继承的AnyLogic帮助。)继承受限于:

  • 你可以覆盖/重载方法(函数)---即在子类中定义一个具有相同名称的方法---但是你不能对字段(变量/参数)做同样的事情,即使它们是私有的在超类中(所以即使是在Java意义上它不会隐藏/遮蔽字段的情况);
  • 您不能将此类子类代理用作模型中的顶级代理。

[感谢nikolaj指出函数覆盖是可能的。我可以发誓我在最初的AnyLogic 7版本中尝试过,它与参数/变量具有相同的限制;也许它在7.0.x版本的一个版本中被改变了?]

根据具体情况,这些都可能非常严格,但在您的示例中,这样就可以了:拥有一个具有/'是'按钮的代理(具有AnyLogic参数的颜色,名称等)。 / p>

请注意,您的onPress伪代码对于可重用代理是有问题的,除非您执行类似List<? extends Person>作为代理的参数的事情(因此,在创建时,它具有对允许的内容的通用引用它通过具有tryToEscapeBuilding功能的代理来循环。

答案 1 :(得分:0)

正如monsieurRigsby所说,您可以创建Agent类的子类。 但它实际上可以覆盖功能。 写吧:    @覆盖 在onPress函数的“自定义修饰符”中