2017-05-06 1 views
0

ok, donc j'ai une classe "Card" avec le constructeur suivant. costume et le rang sont stockés en tant que champs.Pas de constructeur par défaut - héritage

Card(String s, int r){ 
    suit = s; 
    rank = r; 
} 

Je veux revenir au rang avec cette méthode

public int getRank(){ 
    return rank; 
} 

La chose est que je veux appeler cette méthode d'une autre classe nommée Hand si je fais une référence à la classe de carte Card c = new Card(); je pour entrer les paramètres au constructeur. Je ne veux pas faire ça. J'ai essayé de faire Hand étendre Card, mais j'obtiens l'erreur

pas de constructeur par défaut

J'ai cherché une solution, mais je ne peux pas le faire fonctionner.
Ma question est: Comment contourner ce problème?

Edit: classe main

public class Hand extends Card { 
    Deck d = new Deck(); 
    Hand h = new Hand(); 
    ArrayList<Card> hand = new ArrayList<>(); 


    public void giveMeCard(){ 
     hand.add(d.dealCard()); 
    } 


    public ArrayList returnHand(){ 
     return hand; 
    } 

public int rank(){ 


    } 

} 
+0

Veuillez poster votre classe 'Hand'. – hqt

+2

Si vous voulez appeler le constructeur de la carte sans aucun argument, alors la classe Card doit avoir un constructeur qui ne prend aucun argument. Mais à quoi servirait une carte sans costume ou grade? L'héritage est complètement hors de propos. Une main n'est pas une carte, donc la main ne devrait pas étendre la carte. Ça n'a aucun sens. –

+0

Yea s'il vous plaît poster la classe de la main –

Répondre

0

classe I n'a pas de constructeur parameterless, alors les sous-classes doivent appeler l'un des constructeurs existants de la classe de base.

Dans votre cas, vous avez la classe de base

class Card { 
    Card(String s, int r){ 
} 

vous devez donc avoir

Hand extend Card { 
Hand() { 
    super("s","r"); 
} 

qui est sur le côté technique. Sur le côté de la modélisation et de la logique, cela n'a absolument aucun sens que Hand s'étend Card. Hand n'est pas un Card. Il contient set of cards (probablement vide = pas de cartes en main). Aussi (probablement) il y a limite supérieure de cartes en main (dépend du jeu que vous modélisez).

Le modèle de votre carte est correct. Il doit avoir le costume et le rang (ces champs devraient être finaux privés dans la classe Card). Votre carte devrait être immuable. Les joueurs ne devraient pas être en mesure de modifier la carte en main pour d'autres cartes, non? En fait, je modéliserais Rank et Suit comme enums (ils ont un ensemble limité de valeurs bien connues). Dans tous les cas (rang/costume comme chaîne ou enum) vous avez besoin equals/hashcode en Card et Hand classes.

Vous pouvez event modeler Cards comme enums, ou final static champs dans Card classe (une instance pour les cartes réelles).

Lorsque vous traitez un card, vous devez savoir quelle carte traiter: classement et couleur de cette carte. Je suppose que vous ne vendez pas de cartes joker, où le joueur peut peindre ce qu'il veut sur la carte?

Pour moi, vous devriez également avoir Deck carte. giveMeCard méthode devrait prendre (aléatoire) carte de Deck, le retirer du pont et ajouter à la main. Probablement deal est le meilleur nom de la méthode. Il reflète mieux le domaine sous-jacent (jeu de cartes).

+0

Vous voudrez peut-être repenser votre 'super (" s "," r ")' exemple. – Tom

3

Je dois entrer les paramètres dans le constructeur. Je ne veux pas faire ça.

La solution à votre problème est de commencer vouloir faire.

Un Card sans costume et rang spécifique est dénué de sens. Vous ne voulez pas instancier des objets dénués de sens. Vous ne nous avez pas dit quelles sont vos raisons pour ne pas vouloir instancier votre carte avec les paramètres que son constructeur attend, mais quelles que soient vos raisons, elles ne peuvent pas gagner sur l'exactitude. Donc, vous devriez passer le costume et le rang au constructeur, vous devriez faire tout ce qu'il faut pour être en mesure de les passer, et vous ne devriez pas seulement vouloir faire cela, mais en fait aimer faire cela.