2017-05-06 145 views
0

好吧,所以我有一個類「卡」與以下構造函數。西裝和等級被存儲爲字段。沒有默認構造函數 - 繼承

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

是啊,請張貼手牌類 –

回答

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

3

我必須輸入參數給構造函數。我不想這樣做。

的解決問題的方法是開始做到這一點。

A Card沒有具體的訴訟和排名是毫無意義的。你不想實例化無意義的對象。

您還沒有告訴我們您的理由是不想用您的構造函數期望的參數實例化您的卡,但無論您的原因是什麼,它們都無法贏得正確性。因此,你應該把西裝和等級傳遞給構造函數,你應該盡一切努力來傳遞它們,而且你不僅需要這樣做,而且真的很喜歡這樣做。