J'ai donc travaillé sur quelques cartes à jouer en Java. (Pas vraiment pour des raisons pratiques, j'aime juste jouer aux cartes et c'est une bonne pratique) Maintenant, en ce moment, je fais des structures de cartes, des decks, des mains, des piles, etc. Ils sont tous essentiellement les mêmes, donc Je me dis que j'aimerais utiliser un peu d'héritage.Résumé Hérédité et génériques (avec cartes à jouer)
Le problème que j'ai rencontré est que le noyau de chaque structure est un type de collection, mais ils n'utilisent pas tous le même type de collection. Un deck utilise une pile, car un deck fonctionne essentiellement comme une pile le plus souvent. Mais, une main utilise une ArrayList (S'il y a quelque chose de plus efficace qu'une ArrayList à utiliser, cela serait bon à savoir aussi). Ainsi, en essayant d'écrire une classe abstraite, je voudrais éviter d'utiliser des méthodes abstraites (car cela va à l'encontre de l'objectif initial de créer une classe abstraite, de conserver du code). Mais, toutes ces méthodes s'appuient sur la collection de base, pour des raisons évidentes, mais je ne sais pas quel type est la collection. C'est ce que j'ai essayé jusqu'à présent:
public abstract class CardSet
{
protected AbstractCollection<Card> elCollection;
public CardSet()
{
super();
}
public CardSet(Card[] cards)
{
super();
for(Card c: cards)
elCollection.add(c);
}
public void add(Card c)
{
elCollection.add(c);
}
}
public class Pair extends CardSet //Pair is just a dummy class to get inheritance right
{
ArrayList<Card> elPair;
public Pair()
{
elPair = new ArrayList<Card>(); //elPair is defined, because casting
elCollection = elPair; // elCollection to arraylist would be a pain.
}
public Pair(Card[] cards)
{ this();
super(cards);
}
}
Tout d'abord, pardonnez mes noms de variables. J'avais l'habitude de nommer tout "theVariable", mais j'ai décidé que l'utilisation de "el" était plus intéressante. (Vous devez vous amuser d'une façon ou d'une autre, n'est-ce pas?) En outre, utiliser protégé était juste pour des raisons de simplicité. Maintenant, l'idée générale semble fonctionner, définir une variable dans la classe abstraite, puis en définir un alias dans la classe enfant, mais je ne suis pas sûr que ce soit une bonne pratique. Le vrai problème que j'ai est avec le constructeur. Le constructeur dans Pair qui accepte un tableau de cartes ne fonctionne pas, car pour ajouter les cartes, je dois d'abord créer la collection (dans ce cas, ArrayList) avant que le constructeur parent essaie d'ajouter les cartes. Y a-t-il un moyen de contourner ce problème? Est-ce même une façon viable de gérer l'héritage?
Je devais changer cela (new ArrayList()) à ceci ((C) new ArrayList ()), mais j'obtiens maintenant une erreur "opérations non vérifiées ou dangereuses" à cause de cela. –
Retsam
True - J'ai mis à jour pour créer une fabrique statique qui retournera un objet de type safe. – Stephen
Vous pourriez le faire retourner un type générique de liste, mais je crois que dans ce cas vous voulez laisser vos options ouvertes. Je suppose également que le fait d'avoir un constructeur vide est un avantage limité (quand vous créez de toute façon vos classes de spécialistes/commodités) – Stephen