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

时间:2016-02-29 12:33:52

标签: java methods static abstract-class

我正在制作一个关于构建简单行为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(),在我初始化机器人和它将作用的电路板的例程中 - 但我不认为这非常像我想要的解决方案。

1 个答案:

答案 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();