将代理标记为抽象?

时间:2014-11-24 17:55:06

标签: anylogic

AnyLogic中Agents可以标记为abstract吗?如果是这样,怎么样?我正在尝试从Agent继承某些方法,但不会继承其他方法,因为父Agent无法实现这些方法。

1 个答案:

答案 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或类似的东西)。 不是纯粹主义者,而是另一种方法。