是否可以在不扩展它的类方法中引用抽象类方法?

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(),在我初始化机器人和它将作用的电路板的例程中 - 但我不认为这很像我想要的解决方案.

Kir*_*kin 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());
...
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)