我正在创建一个我想经常重复使用的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()
}
这可能吗?
答案 0 :(得分:1)
你不能编写自己的代理(作为普通的Java类),其中包含AnyLogic模型构建UI中的元素,如果这就是你的意思(另外,如果你编写自己的Java类扩展代理,你有知道用于两个必需构造函数的正确签名,您可以从查看为其他代理生成的代码中看到这些签名。
但是,在AnyLogic 7中,您可以直观地设计代理,然后使用有限形式的继承来创建此代理的子类。 (请参阅基于代理的建模下的代理继承的AnyLogic帮助。)继承受限于:
[感谢nikolaj指出函数覆盖是可能的。我可以发誓我在最初的AnyLogic 7版本中尝试过,它与参数/变量具有相同的限制;也许它在7.0.x版本的一个版本中被改变了?]
根据具体情况,这些都可能非常严格,但在您的示例中,这样就可以了:拥有一个具有/'是'按钮的代理(具有AnyLogic参数的颜色,名称等)。 / p>
请注意,您的onPress伪代码对于可重用代理是有问题的,除非您执行类似List<? extends Person>
作为代理的参数的事情(因此,在创建时,它具有对允许的内容的通用引用它通过具有tryToEscapeBuilding
功能的代理来循环。
答案 1 :(得分:0)
正如monsieurRigsby所说,您可以创建Agent类的子类。 但它实际上可以覆盖功能。 写吧: @覆盖 在onPress函数的“自定义修饰符”中