0

我正在创建一个我想经常重复使用的 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()
  }

这可能吗?

4

2 回答 2

1

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

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

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

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

根据具体情况,这两者都可能非常严格,但在您的示例中,这会很好:拥有一个具有/“是”按钮的代理(具有颜色、名称等的 AnyLogic 参数)。

请注意,您的 onPress 伪代码对于可重用代理来说是有问题的,除非您执行诸如将 aList<? extends Person>作为代理的参数之类的操作(因此,在创建时,它具有对允许它通过具有tryToEscapeBuilding函数的代理循环的东西的通用引用)。

于 2014-10-20T09:25:40.353 回答
0

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

于 2014-10-21T08:30:50.413 回答