2017-02-11 1 views
0

Je travaille actuellement sur un projet indépendant d'écriture d'un jeu d'échecs. Le problème auquel je suis actuellement confronté est que j'ai une méthode qui renvoie un arraylist de type Move (explicite) qui est appelé lors de la détermination de tous les mouvements légaux. Bien que cela fonctionne bien, j'ai introduit une classe appelée Castle, qui étend Move (je l'ai fait parce que contrairement à un mouvement normal, roque affecte 4 carrés et pas seulement 2). Je voudrais que la méthode getMoves() soit autonome, ou soit capable de retourner tous les mouvements valides y compris les objets de type Move et son château enfant. Le problème est si j'inclue une déclaration qui ajoute des mouvements de ronronnement valides à la méthode getMoves (qui retourne une liste de type de type move). Je peux soit a) ajouter l'arraylist comme un déplacement de type, dans lequel les informations sont perdues , ou b.) un château de type, qui change l'arraylist de retour à un type de tout château et casse évidemment la méthode.Java ArrayLists: Ajout de la classe parent et de la sous-classe au même arraylist, solutions

Existe-t-il une manière gracieuse d'accomplir ceci? Je cherche des façons de résoudre ce problème sans réécrire la classe de déplacement tout en gardant la méthode getMoves autonome.

+0

Je ne peux pas dire ce que vous entendez par "ajouter l'arraylist comme un mouvement de type". Pouvez-vous le démontrer avec du code? – immibis

+0

Au lieu de votre classe Castle qui étend la classe Move, pourquoi ne pas créer une propriété dans la classe Move de type "Castle"? Exemple de code: 'class Déplacer { privé Castle castle; // propriété castle // getter setter ci-dessous } ' –

Répondre

0

Une autre option est que vous pouvez utiliser générique ici. Dans votre cas, vous voulez renvoyer une liste de Move ou Castle, ou dans global mean, une liste de Move ou de son sous-type. Ci-dessous un exemple de code:

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

Avec cette façon, si vous avez besoin d'ajouter un autre sous-type de déménagement autre que le château, vous n'avez pas besoin de modifier le type de retour plus.

+0

Downvoting car cela ne semble pas utile.Cela signifie que l'appelant peut soit appeler getMoves() 'pour obtenir une' Liste 'ou' getMoves() 'pour obtenir un' Liste '- WTF? – immibis

1

Vous pouvez utiliser l'arborescence des objets de déplacement et vérifier l'objet Castle à l'aide de l'opérateur instanceof. Puis caste l'objet au type de château.

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

// Faites ce que tu veux faire avec castleobject

}

+0

Merci pour l'aide. Quand j'essaye de faire ceci cependant, l'information unique qui a été ajoutée au type de château a été perdue. Il est possible qu'il y ait eu une autre erreur dans mon code. – user22205

+0

Trouvé l'erreur, maintenant cette méthode fonctionne. Meilleur! – user22205

0

Il est difficile de faire une bonne décision de conception sans voir comment tout est utilisé, mais voici quelques solutions que vous pourriez considérer:

  1. faire un Move superclasse des deux BasicMove et Castling, puis faites votre méthode Renvoie une liste de cette superclasse Move. Dans ce cas, votre classe actuelle Move doit être renommée BasicMove.

  2. Ajouter un Castling comme un champ dans la classe Move. Vous pouvez sauvegarder le mouvement de la tour dans la classe Move et le déplacement du roi dans le nouveau champ Castling.