1

私はJavaクラスのためにこのAntFarmプロジェクトを行っています。このプロジェクトは、さまざまなクラス (Food、WorkerAnt、Queen) で構成され、インターフェイス (プロセスと呼ばれるメソッド) を使用して相互にやり取りします。

http://ljhs.sandi.net/faculty/volger/apajava/GridWorld/Assignments/AntFarm/ - プロジェクト

私は現在、 のprocessActors()メソッドで立ち往生していWorkerAntます。(ページのほぼ一番下にあります。)

現在のコードは次のとおりです。

public void processActors(ArrayList<Actor> actors) {
  for (Actor nextActor : actors) {
    nextActor.process(this); 
  }
}

私が得るエラーは次のとおりです。

シンボル symbol が見つかりません: メソッド process(WorkerAnt)

4

1 に答える 1

2

リンクされた割り当てで行くにActorは、メソッドがありませんprocess(WorkerAnt)

代わりに、これはProcessableインターフェースの一部です (したがってFood)。

そのため、 yourActorActor実装であることを確認してくださいProcessable(たとえば、 a Food)。

processActors(ArrayList<Actor> actors)理想的には、メソッドを次のように変更しますprocessProcessables(ArrayList<Processable> processables)

ただし、課題では a を実装する必要があるprocessActors(ArrayList<Actor> actors)ため、実際にはこれを行うことはできません (ただし、これを悪い設計と呼びますが、のdivide(object, object)代わりにメソッドを使用することに似ていdivide(double, double)ます)。

なぜそれが悪いデザインなのかを見るために、割り当ては言う

processActors: アクター内の各アクターは、そのプロセス メソッドを呼び出す必要があります。

ただし、 s にはメソッドActorがありません- s にはありますが、s にはありません。processProcessableActorProcessable

Actorいずれにせよ、いくつかの s がs であると予想し、次のようにするという事実に落ち着く必要がありますProcessable

for(Actor nextActor : actors)
{
    if (nextActor instanceof Processable)
        ((Processable)nextActor).process(this); 
}

ただし、割り当てからこれを認識している必要があります。

アクターは、QueenAnt、Cake、Cookie、または WorkerAnt である可能性があります。Processable インターフェースがなければ、processActors はアクターのタイプを決定し、次にプロセスへの呼び出しを行う前にアクター参照をダウンキャストする必要があります。ただし、これらのクラスはそれぞれ Processable を実装しているため、processActors は呼び出しの前にアクターを Processable にキャストするだけで済みます。Processable にはプロセス抽象メソッドが含まれているため、この多態的な処理が可能です。Java ランタイム環境 (JRE) は、実行時にオブジェクトの実際のタイプを判別し、適切なプロセス メソッドを呼び出します。

于 2011-05-13T00:11:49.480 に答える