Far*_*apo 5 java methods static abstract-class
我正在学习构建简单行为Ai的教程.它的"大脑"类是抽象的,包含"跑步","成功","失败"等状态.现在在我的ai单元 - 机器人类我有一个方法来启动机器人的大脑.
public void update(){
if(Routine.getState()==null){
Routine.start();
}
Routine.act(this, board);
}
Run Code Online (Sandbox Code Playgroud)
现在这在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;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将该方法复制到扩展例程的类之一,但这不起作用或者出现相同的问题.静态需求在包含此内容的start()和act()上尤其困难.并且是初始化器.我只能按照原样使方法update(),在我初始化机器人和它将作用的电路板的例程中 - 但我不认为这很像我想要的解决方案.
当然,您可以引用抽象类并调用其抽象类,但您确切引用的对象应该是抽象类的扩展程序。
例如,创建一系列不同的对象,所有对象都扩展一个抽象类。
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());
...
Run Code Online (Sandbox Code Playgroud)
然后,您可以对其调用抽象方法。
for (ExAbstract test : list){
test.abstractmethod();
}
Run Code Online (Sandbox Code Playgroud)
(或Java 8)
list.forEach(ExAbstract::abstractmethod);
Run Code Online (Sandbox Code Playgroud)
但是如果 object 没有扩展abstact,并且它本身就是abstract,那么就会出错。
编辑:在您的情况下,对于 Routine 类,您应该为其创建一个构造函数,然后创建一个新对象。(我看到你已经有一个构造函数了......)如果你想使用一个方法而不创建一个对象,请使用static
在 Routine.java 中:
public Routine(ExampleArg a){
this.a = a;
}
Run Code Online (Sandbox Code Playgroud)
在您的日常通话中:
Routine r = new Routine(a);
r.start();
Run Code Online (Sandbox Code Playgroud)