【发布时间】:2015-01-22 12:52:25
【问题描述】:
AnyLogic 中的Agents 可以标记为abstract 吗?如果是这样,怎么做?我正在尝试从Agent 继承某些方法,但不是其他方法,因为父Agent 实现它们是没有意义的。
【问题讨论】:
-
您的问题如果包含一些说明性代码会更好。
-
不过,这是一个是/否的问题。它们可以是抽象的,还是不能?
标签: anylogic
AnyLogic 中的Agents 可以标记为abstract 吗?如果是这样,怎么做?我正在尝试从Agent 继承某些方法,但不是其他方法,因为父Agent 实现它们是没有意义的。
【问题讨论】:
标签: anylogic
您不能在GUI 设计的代理 中声明任何abstract(类或方法(AnyLogic 函数)),但您可以将代理创建为用户定义的Java 类(即,通过 New --> Java Class),即abstract。为此,您需要知道适当的构造函数签名,AnyLogic 没有记录这些签名(但您可以通过查看为任何代理生成的 Java 代码很容易地看到它们)。因此,您将需要如下所示的内容(注意似乎从未使用过的默认构造函数):
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 或类似的),但这意味着有一个抽象代理只是有抽象方法(因此有一个“不必要的”继承级别)。
另一种方法是通过强制运行时符合任何子类代理中所需的(覆盖)方法来“近似”抽象类。只需在父级中定义您的 required-in-subclass-Agent 函数,如下所示:
throw new IllegalStateException("Subclass must implement specialAbstractMethod()");
(或者,更好的是,扔你自己的MissingRequiredOverrideException 或类似的)。
不是一个纯粹主义者,但也不是另一种方法。
【讨论】: