2017-02-11 7 views
0

私は現在、チェスのゲームを書くの独立したプロジェクトに取り組んでいます。私が現在直面している問題は、すべての法的な動きを決定するときに呼び出されるMove(タイプ説明)型のarraylistを返すメソッドがあるということです。これはうまくいきますが、キャッスルと呼ばれるクラスを導入しました。これはMoveを拡張しています(これは通常の移動とは異なり、キャスティングは2つではなく4つのスクエアに影響するためです)。のJavaのArrayList:同じArrayListに親クラスとサブクラスの追加、ソリューション

私は自己完結型であるか、またはタイプの移動とその子城のオブジェクトを含む有効な移動のすべてを返すことができるように)(メソッドのgetMovesをしたいと思います。

getMoves(move型の配列リストを返す)に有効なキャスト動作を追加する宣言を含めると、問題が発生します。arraylistを型移動として追加して情報が失われる、またはb。)戻りのarraylistをすべての城のタイプに変更し、明らかに方法を破るタイプの城。

これを達成するための任意の優雅な方法はありますか?私はgetMovesメソッドを独立して保持しながら、移動クラスを書き直すことなくこの問題を解決する方法を探しています。

+0

「タイプの移動としてarraylistを追加する」という意味を理解できません。あなたはコードでそれを実証できますか? – immibis

+0

Moveクラスを拡張するCastleクラスの代わりに、 "Castle"タイプのMoveクラス内にプロパティを作成しないでください。 例コード: 'クラス移動{ プライベート城の城。 // castleプロパティ // getter setter below } ' –

答えて

0

別のオプションは、ここで一般的な使用することができるということです。あなたの場合、MoveまたはCastleのリスト、またはグローバルな意味のリスト、Moveまたはそのサブタイプのリストを返したいとします。以下はサンプルコードです:あなたは城以外の移動の別のサブタイプを追加する必要がある場合は、この方法では

public <T extends Move> List<T> getMoves(); 

、あなたはそれ以上の戻り値の型を変更する必要はありません。

+0

これは役に立たないと思われるので、下降してください。これは、呼び出し側が 'List ' - WTFを得るために ' getMoves()'を呼び出して 'List 'または ' getMoves()'を呼び出すことができることを意味します。 – immibis

1

あなたは、移動オブジェクトの配列リストを使用してのinstanceof演算子を使用して城のオブジェクトを確認することができます。その後、オブジェクトを城の型にカスケードします。

uはcastleobject

でやりたいものは何でも

if(moveobject instanceof Castle){ 
Castle castleobject = (Castle) moveobject; 

//ドゥ}

+0

助けてくれてありがとう。私がこれをやってみると、城のタイプに加えられたユニークな情報が失われました。しかし、私のコードには別のエラーがあった可能性があります。 – user22205

+0

エラーが見つかりました。このメソッドが動作するようになりました。ベスト! – user22205

0

それはあなたがここでのソリューションのカップルができているすべてのものが使用されている方法を見なくて良いデザインの決定を下すのは難しいですが、検討してください:

  1. BasicMoveCastling両方のMoveスーパークラスを作成し、その後、あなたの方法を作りますそのMoveスーパークラスのリストを返します。この場合、現在のMoveクラスの名前をBasicMoveに変更する必要があります。

  2. Moveクラス内のフィールドにCastlingを追加します。あなたはルーンの動きをMoveクラスの中に保存し、新しいCastlingフィールドの中の王の移動を保存することができます。