2016-02-29 30 views
5

我正在构建一个简单的行为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()方法,在例程中初始化Droid和它将执行的电路板 - 但我不认为这很像我想要的解决方案。

+1

是否可以使用工厂初始化一个这样的类并使用实例?你可以声明最后的例程例程= RoutineFactory.createRoutine();并根据需要在您的电话中使用它。您将需要一个实现,以根据需要更新特定于实例的项目来运行这些方法。为什么你不能使用继承? –

+0

你当然需要一个对象实例来调用它的方法(抽象与否)。 – Thilo

回答

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); 

但如果对象是不延长abstact,它是抽象的本身,它会给出一个错误。

编辑:在你的情况下,与例程类,你应该为它做一个构造函数,然后创建一个新的对象。 (我看你有一个构造函数已经...)如果你想使用的方法,而无需创建一个对象,使用static

在Routine.java:

public Routine(ExampleArg a){ 
    this.a = a; 
} 

在你的日常电话:

Routine r = new Routine(a); 
r.start(); 
相关问题