没有默认构造函数 - 继承

问题描述:

好吧,所以我有一个类“卡”与以下构造函数。西装和等级被存储为字段。没有默认构造函数 - 继承

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


    } 

} 
+0

请张贴您的'手'类。 – hqt

+2

如果你想调用没有任何参数的Card构造函数,那么Card类必须有一个不带任何参数的构造函数。但是没有套装或排名的卡牌会有什么用处?继承是完全不相关的。手不是卡,所以手不应该扩展卡。这是没有意义的。 –

+0

是啊,请张贴手牌类 –

我类没有参数的构造函数,则子类必须调用基类的构造函数存在的一个。

你的情况,你有基类

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

所以你必须有

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

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

您的卡片型号正确。它必须有套装和等级(这些字段应该在Card课程中是私人最终的)。你的卡应该是不可变的。玩家不应该能够将卡变成其他卡,对吧?实际上,我将模型RankSuit作为枚举(它们具有众所周知的有限的一组值)。 在任何情况下(排名/诉讼作为字符串或枚举),你需要equals/hashcodeCardHand类。

您可能想要将Cards作为枚举或final static类型的Card类(实际卡的一个实例)。

当处理card时,您必须知道要处理的牌:该牌的等级和套牌。我想,你不是在处理百搭牌,玩家可以在牌上画什么?

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

+0

你可能想重新考虑你的超级(“s”,“r”)例子。 – Tom

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

的解决问题的方法是开始做到这一点。

A Card没有具体的诉讼和排名是毫无意义的。你不想实例化无意义的对象。

您还没有告诉我们您的理由是不想用您的构造函数期望的参数实例化您的卡,但无论您的原因是什么,它们都无法赢得正确性。因此,你应该把西装和等级传递给构造函数,你应该尽一切努力来传递它们,而且你不仅需要这样做,而且真的很喜欢这样做。