2012-11-29 63 views
0

我正在使用Java。我有2班扩展类,隐式超级构造函数未定义错误

class Card 
class Deck extends Card 

我得到一个构造函数错误。

我必须为大学做一个二十一点游戏,并且甲板班必须延长。

我能做些什么来解决这个问题?

class Card 
{ 
    int rank, suit; 
    String[] suits = { "hearts", "spades", "diamonds", "clubs" }; 
    String[] ranks = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" }; 

    Card(int suit, int rank) 
    { 
     this.rank=rank; 
     this.suit=suit; 
    } 

    String toString() 
    { 
      return ranks[rank] + " of " + suits[suit]; 
    } 

    int getRank() { 
     return rank; 
    } 

    int getSuit() { 
     return suit; 
    } 
} 




class Deck extends Card{ 

    ArrayList <Card> cards; 
    int numberdeck; 
    Deck() 
    { 
     cards = new ArrayList<Card>(); 
     for (int a=0; a<=3; a++) 
     { 
      for (int b=0; b<=12; b++) 
      { 
       cards.add(new Card(a,b)); 
      } 
     } 
    } 

    Card drawFromDeck() 
    { 
     Random generator = new Random(); 
     int index= generator.nextInt(cards.size()); 
     return cards.remove(index); 
    } 

    int getTotalCards() 
    { 
     return cards.size(); 
    } 
} 

回答

3

子类中的构造函数应该调用超类中相应的构造函数,但是在代码中找不到这样的构造函数。

可以添加一个构造函数,该构造函数不向超类引用任何参数,或者使子类中的构造函数调用超类中的构造函数。

您可以在子类的构造函数体的开头使用super(0, 0);来调用超类的构造函数。

+0

每种方式会有什么不同? –

2

Deck确实不应该延伸Card。子分类编码is-a关系。狮子是一种动物,所以Lion extends Animal。你可以知道子分类是不合适的,因为getRank()和getSuit()方法在整张纸牌上没有意义。

一副牌不是牌;一副牌包含其他牌。 包含关系已由ArrayList <Card> cards数组表示。

+0

这就是我们必须要做的。我们有2个选项。选项1 =甲板实现CardInterface或Option2:class甲板扩展卡 – emre

+0

@ baris22好吧,教授没有冒犯,但是这两种选择都是不好的面向对象的设计。 –

+0

无论如何选择接口的方法,至少为你的下一个家庭任务。继承是15年前流行的技术。继承有许多缺点。 – AlexWien

相关问题