AnyLogic中Agents
可以标记为abstract
吗?如果是这样,怎么样?我正在尝试从Agent
继承某些方法,但不会继承其他方法,因为父Agent
无法实现这些方法。
答案 0 :(得分:2)
您不能在 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
或类似的),但这意味着有一个摘要只是的代理具有抽象方法(因此一个'不必要的'继承级别)。
另一种方法是通过强制运行时符合任何子类代理中所需的(重写)方法来“近似”抽象类。只需在父类中定义您所需的子类 - 代理函数,如:
throw new IllegalStateException("Subclass must implement specialAbstractMethod()");
(或者,更好的是,抛出你自己的MissingRequiredOverrideException
或类似的东西)。
不是纯粹主义者,而是另一种方法。