2016-02-29 6 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; 
    } 


} 

私はルーチンを拡張するクラスの1つにする方法をコピーしようとしたが、それは動作しませんか同じ問題が生じる。 静的要件は、これを含むstart()およびact()では特に困難です。初期化子です。 メソッドupdate()は、ドロイドを初期化してボードを動作させるルーチンのようにしかできませんが、これは私が持っていたいソリューションのようには見えません。

+1

このようなクラスを工場で初期化してインスタンスを使用することは可能ですか?あなたは最終ルーチンルーチン= RoutineFactory.createRoutine()を宣言できます。必要に応じてあなたの電話でそれを使用してください。インスタンス固有の項目を更新するのに必要なメソッドを実行するための実装が必要になります。なぜあなたは継承を利用できないのですか? –

+0

メソッドを呼び出すには、オブジェクトインスタンスが必要です(抽象であるかどうかは関係ありません)。 – Thilo

答えて

1

もちろん、抽象クラスを参照して抽象クラスを呼び出すこともできますが、正確に参照するオブジェクトは抽象クラスのエクステンダでなければなりません。

たとえば、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を延長していなかった、そしてそれは抽象そのものだった場合、それはエラーを与えるだろう。

EDIT:あなたのケースでは、ルーチンクラスでは、そのコンストラクタを作成して新しいオブジェクトを作成する必要があります。あなたがオブジェクトを作成せずにメソッドを使用する場合は、Routine.javaでstatic

を使用する(私は...あなたはすでにコンストラクタを持っている参照してください)。

:あなたのルーチンの呼び出しで

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

Routine r = new Routine(a); 
r.start(); 
関連する問題