Can Agents
in AnyLogic be marked as abstract
? If so, how? I'm trying to inherit certain methods from an Agent
, but not others as it makes no sense for the parent Agent
to have them implemented.
1 に答える
GUI で設計されabstract
た Agent では何も (クラスまたはメソッド (AnyLogic 関数)) を宣言できませんが、Agent をユーザー定義の Java クラスとして作成することはできます (つまり、[新規] --> [Java クラス] を使用) 。そのためには、AnyLogic が文書化していない適切なコンストラクター シグネチャを知る必要があります (ただし、任意のエージェントに対して生成された Java コードを表示することで、十分に簡単に確認できます)。したがって、次のようなものが必要になります (使用されないように見えるデフォルトのコンストラクターに注意してください)。abstract
public abstract class MyAbstractAgent extends Agent
implements java.io.Serializable {
private static final long serialVersionUID = 1L;
/**
* Constructor in form required for an Agent subclass to be instantiated and for
* superclass instantiation (as gleaned from looking at Java source of
* visually-created Agents)
*/
public MyAbstractAgent(Engine engine,
Agent owner,
AgentList<? extends MyAbstractAgent> collection) {
super (engine, owner, collection);
}
/*
* Simple constructor as now included in all AnyLogic 7 generated Agent code. Don't
* understand when this would be invoked cf. the others so let's assert that we
* don't think it should
*/
public MyAbstractAgent() {
throw new AssertionError("Not expecting simple constructor to be used!");
}
// Using package visibility (the default for GUI-designed functions)
abstract specialAbstractFunction();
}
ただし、おそらく非抽象メソッドを混在させたいので、これらを GUI 設計のエージェント (上記のクラスextends MyGUI_Agent
または類似のクラス) に含めることが望ましいですが、これは、抽象メソッドだけを持つ抽象エージェント (およびしたがって、1 つの「不要な」レベルの継承)。
別の方法は、任意のサブクラス Agent で必要とされる (オーバーライドされた) メソッドに実行時の適合を強制することによって、単に抽象クラスを「概算」することです。親でrequired-in-subclass-Agent関数を次のように定義するだけです:
throw new IllegalStateException("Subclass must implement specialAbstractMethod()");
(または、より良いのは、独自のものMissingRequiredOverrideException
または類似のものを投げることです)。純粋主義者向けではありませんが、他の方法でもありません。