2014-10-17 36 views
0

我正在創建一個我想經常重複使用的AnyLogic代理。在許多AnyLogic代理和組件中,有些空間可以輸入代碼,如「on receive」或「Action」或「function body」。當模型被構建時,這些被編譯到代理中。一般程序員如何做到這一點?如何在AnyLogic中使用「code」參數創建代理?

例如,假設我有這樣的代理(僞代碼,很明顯):

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

這是可能的:

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. 

客戶端如下可能會使用它?

回答

1

如果這就是你的意思,那麼你不能編寫你自己的代理(作爲普通的Java類),它包含了AnyLogic模型構建UI中的元素(另外,如果你編寫自己的Java類來擴展代理,必須知道用於兩個必需構造函數的正確簽名,您可以通過查看爲其他代理生成的代碼來看到這些簽名)。

但是,在AnyLogic 7中,您可以直觀地設計代理,然後使用有限形式的繼承來創建此代理的子類。 (參見下基於Agent建模在代理繼承了AnyLogic的幫助。)繼承是有限的:

  • 可以覆蓋/超載方法(函數)---即在子類中定義一個具有相同名稱---但是對於字段(變量/參數),即使它們在超類中是私有的,也不能做同樣的事情(所以即使是在Java中也不會隱藏/遮蔽字段的情況下)。
  • 您不能將這樣的子類Agent用作模型中的頂級代理。

[感謝nikolaj指出函數覆蓋是可能的。我可以發誓我在最初的AnyLogic 7版本中嘗試過,它與參數/變量有相同的限制;也許它在7.0.x的其中一個版本中發生了變化?]

這兩個都可能是相當受限制的,取決於具體情況,但在您的示例中,這樣做可以:有一個代理具有/'是'一個按鈕(帶有AnyLogic參數的顏色,名稱等)。

請注意,您的onPress僞代碼對於可重複使用的代理程序是有問題的,除非您執行類似於List<? extends Person>作爲您的代理程序的參數(因此,創建時,它具有對允許其循環的內容的泛型引用通過具有tryToEscapeBuilding函數的代理)。

0

as monsieurRigsby說,您可以創建Agent類的子類。 但它實際上可以覆蓋功能。 只寫: @Override 在onPress函數的「自定義修飾符」中

+0

什麼是「自定義修飾符」?我之前從未聽過這個術語,關於AnyLogic。 – 2014-10-21 15:51:15

+0

啊,有趣;我需要玩一玩。 (你仍然錯過抽象方法之類的東西,儘管你可以用一個超類方法(函數)來近似它,這會創建一個異常,並說它需要被覆蓋。)我很確定你不能影響字段(它不會讓你添加具有相同名稱的字段),儘管這通常不太有用。 – 2014-10-21 16:43:18

+0

@monsieurRigsby,我不知道你是什麼意思的「陰影字段」,但你可以重寫:方法,參數,變量等在超類 – 2014-10-24 10:01:00

相關問題