没有默认构造函数 - 继承

时间:2017-05-06 09:10:56

标签: java inheritance constructor extends

好的,所以我有一个班级"卡"使用以下构造函数。套装和等级存储为字段。

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

我想用这个方法返回排名

public int getRank(){
   return rank;
}

我想从另一个名为Hand的类中调用此方法 如果我引用卡类Card c = new Card();,我必须将参数输入到构造函数中。我不想这样做。 我试图让Hand扩展Card,但后来我收到了错误

  

没有默认构造函数

我已经找到了解决方案,但我无法让它发挥作用 我的问题是:如何解决这个问题?

编辑:手工课

    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(){


    }

}

2 个答案:

答案 0 :(得分:3)

  

我必须将参数输入到构造函数中。我不想这样做。

问题的解决方案是启动想要来执行此操作。

没有特定诉讼和等级的Card毫无意义。您不希望实例化无意义的对象。

您没有告诉我们您不希望使用其构造函数所期望的参数来实例化您的卡的原因是什么,但无论您的原因是什么,它们都无法赢得正确性。

所以,你应该将套装和等级传递给构造函数,你应该尽一切可能传递它们,你不仅应该这样做,而且实际上喜欢这样做。

答案 1 :(得分:0)

我的类没有无参数构造函数,那么子类必须调用基类的现有构造函数之一。

在您的情况下,您有基类

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

所以你必须

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

关于技术方面的问题。关于建模和逻辑方面,绝对没有意义Hand扩展CardHand不是Card 。它包含set of cards(可能是空集=手中没有卡)。另外(可能)手中有卡的上限(取决于你建模的游戏)。

您的卡片型号是否正确。它必须具有套装和等级(这些字段应该是Card类中的私有最终字段)。你的卡应该是不可变的。玩家不应该将牌改为其他牌,对吧?实际上,我会将RankSuit建模为枚举(它们具有众所周知的有限值集)。 在任何情况下(排名/适合为字符串或枚举),您需要equals/hashcodeCard类中的Hand

您可能希望将Cards建模为枚举,或final static类中的Card字段(实际卡片的一个实例)。

在处理card时,您必须知道要处理的是哪张牌:该牌的排名和套牌。我想,你不是在处理小丑牌,玩家可以在牌上画任何他想要的东西吗?

对我来说,你也应该有Deck卡。 giveMeCard方法应该从Deck获取(随机)卡片,将其从卡片中删除并添加到手中。可能deal是该方法的更好名称。它更好地反映了底层域名(纸牌游戏)。