我正在制作一个关于构建简单行为Ai的教程。它的“大脑”类是抽象的,包含“跑步”,“成功”,“失败”等状态。现在在我的ai单元 - 机器人类我有一个方法来启动机器人的大脑。
public void update(){
if(Routine.getState()==null){
Routine.start();
}
Routine.act(this, board);
}
现在这在java中是不可能的,因为它是对非静态方法的静态引用。 我想在这里引用的例程抽象类是这样的:
public abstract class Routine {
public enum RoutineState{
Success,
Failure,
Running
}
protected RoutineState state;
protected Routine() { }
public void start(){
this.state = RoutineState.Running;
}
public abstract void reset();
public abstract void act(droid droid, board board);
public void succed(){
this.state = RoutineState.Success;
}
public void Fail(){
this.state = RoutineState.Failure;
}
public boolean isSuccess(){
return state.equals(RoutineState.Success);
}
public boolean isFailure(){
return state.equals(RoutineState.Failure);
}
public boolean isRunning(){
return state.equals(RoutineState.Running);
}
public RoutineState getState(){
return state;
}
}
我已经尝试将该方法复制到扩展例程的类之一,但这不起作用或者出现相同的问题。 静态需求在包含此内容的start()和act()上尤其困难。并且是初始化器。 我只能按照原样使方法update(),在我初始化机器人和它将作用的电路板的例程中 - 但我不认为这非常像我想要的解决方案。
答案 0 :(得分:1)
当然,您可以引用一个抽象类并调用它的抽象类,但您准确引用的对象应该是抽象类的扩展器。
例如,创建一个不同对象的列表,所有对象都扩展一个抽象类。
public abstract class ExAbstract { public abstract void abstractmethod() {...} }
public class ExampleA extends ExAbstract { @Override... }
public class ExampleB extends ExAbstract { @Override... }
...
List<ExAbstract> list = new ArrayList<>();
list.add(new ExampleA());
list.add(new ExampleB());
...
然后,你可以在上面调用抽象方法。
for (ExAbstract test : list){
test.abstractmethod();
}
(或Java 8)
list.forEach(ExAbstract::abstractmethod);
但是如果对象没有扩展抽象,并且它本身就是抽象的,那么就会出错。
编辑:在你的情况下,使用Routine类,你应该为它创建一个构造函数,然后创建一个新对象。 (我看到你已经有了构造函数......)如果你想在不创建对象的情况下使用方法,请使用static
在Routine.java中:
public Routine(ExampleArg a){
this.a = a;
}
在你的日常电话中:
Routine r = new Routine(a);
r.start();