リンクされた割り当てで行くにActor
は、メソッドがありませんprocess(WorkerAnt)
。
代わりに、これはProcessable
インターフェースの一部です (したがってFood
)。
そのため、 yourActor
がActor
実装であることを確認してください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 にはありません。process
Processable
Actor
Processable
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) は、実行時にオブジェクトの実際のタイプを判別し、適切なプロセス メソッドを呼び出します。