【问题标题】:No default constructor - inheritance没有默认构造函数 - 继承
【发布时间】:2017-10-04 17:56:13
【问题描述】:

好的,所以我有一个带有以下构造函数的类“Card”。西装和等级存储为字段。

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


    }

}

【问题讨论】:

  • 请发布您的Hand 课程。
  • 如果要调用不带任何参数的 Card 构造函数,那么 Card 类必须有一个不带任何参数的构造函数。但是没有花色或等级的牌有什么用呢?继承是完全无关的。手不是卡片,因此手不应该扩展卡片。这没有任何意义。
  • 是的,请发手课
  • 当你打电话给Card c = new Card() 时,你想让c 持有什么卡片?
  • 你到底想在这里做什么?我认为你缺乏一些基本的 java/编程知识,所以你最好的主意可能是做一些 OO 教程,然后再提出一个更具体的问题。

标签: java inheritance constructor extends


【解决方案1】:

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

解决问题的方法是开始想要这样做。

没有特定花色和等级的Card 毫无意义。您不想实例化无意义的对象。

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

因此,您应该将花色和等级传递给构造函数,您应该尽一切努力能够通过它们,并且您不仅应该想要这样做,而且真的应该喜欢这样做。

【讨论】:

    【解决方案2】:

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

    在你的情况下,你有基类

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

    所以你必须有

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

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

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

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

    在发card 时,您必须知道要发什么牌:该牌的点数和花色。我猜,你不是在发百搭牌,玩家可以在牌上画任何他想画的东西?

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

    【讨论】:

    • 您可能需要重新考虑您的 super("s","r") 示例。
    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2015-07-09
    • 2011-05-20
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多