如何访问对象内的对象?

时间:2012-11-14 07:26:17

标签: java oop inheritance stack

我正在尝试建立一个二十一点游戏。我已经创建了一个套牌,现在我想要显示它。

我知道我做错了,因为我无法访问CardStack类中的displayStack。此外,我有一种感觉,我没有正确地继承。我怎么能解决这个问题?

这是我的代码:

public class CreateCardDeck {
    int deckSize = 52;
    CardStack cardStack = new CardStack(deckSize);

    public void CreateDeck() {
        String[] suit = {"clubs", "diamonds", "hearts", "spades"};
        int[] rank = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

        for (int i = 0; i < rank.length; i ++) {
            for (int j = 0; j < suit.length; j++) {
                cardStack.push(suit[j], rank[i]);
            }
        }
    }
}

卡类:

class Card {
    String suit;
    int rank;

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

    public String getSuit() {
        return suit;
    }

    public String getRank() {
        String nameTheRank;
        if (rank == 1)
            nameTheRank = "Ace";
        else if (rank == 11)
            nameTheRank = "Jack";
        else if (rank == 12)
            nameTheRank = "Queen";
        else if (rank == 13)
            nameTheRank = "King";
        else
            nameTheRank = String.valueOf(rank);
        return nameTheRank;
    }
}

CardStack课程:

class CardStack {
    public void displayDeck() {
        for (int i = 0; i < stackArray.length; i ++)
            System.out.println(stackArray[i]);
    }
}

主要类别:

public class MainClass {
    public static void main(String[] args) throws IOException {
        CreateCardDeck c = new CreateCardDeck();
        c.CreateDeck();
        // How to display my deck?
    }
}

4 个答案:

答案 0 :(得分:2)

我会重新设计您的类型。 CreateCardDeck听起来应该是createDeck或可能只是CardDeck类型中名为Card的静态方法。这听起来像西装和数字的知识不应该真正成为该方法的一部分。卡片通常用作Java中枚举的演示 - 一个用于值的枚举(ace为王)和一个用于套装。

想想拥有CreateCardDeck实例的真正含义 - 这真的对你有意义吗?感觉更像是动词(方法)而不是名词(类型)。

现在你可以拥有CardDeckFactory或类似的东西 - 但是我不希望甲板成为对象状态的一部分;它只会被一种方法返回。

答案 1 :(得分:1)

你在寻找这个吗?扩展课程CreateCardDeck并引用它的cardStack变量?

 class Card extends CreateCardDeck
 {
    public void displayDeck()
    {
        for (int i = 0; i < cardStack.size(); i ++)
            System.out.println(cardStack.get(i));
    }
 }

答案 2 :(得分:1)

让我们尽可能简单:你需要一张牌来开始打牌,这样会更好 然后你需要一个甲板来存储你的所有卡。

所以你可以有两个类:Deck和Card。当你创建一个牌组的实例时,它会生成你需要玩的52张牌。

public class Card{}

public class Deck
{
    int deckSize = 52;
    // Here you certainly need a list or a stack to stock your card
    SomeContainer cardStack;

    public Deck()
    {
        String[] suit = {"clubs", "diamonds", "hearts", "spades"};
        int[] rank = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

        for (int i = 0; i < rank.length; i ++)
        {
            for (int j = 0; j < suit.length; j++)
            {
                cardStack.push(new Card(suit[j], rank[i]));
            }
        }
    }

    public void Display()
    {
        for (int i = 0; i < cardStack.length; i ++)
            System.out.println(cardStack[i]);
    }
}

public class MainClass 
{
    public static void main(String[] args) throws IOException
    {
        Deck deck = new Deck();
        deck.Display();
    }
}

答案 3 :(得分:1)

您没有显示您的CardStack类,也没有显示所有的Card类

基本上你应该有一个showCards()方法, 而且在卡本身中,实现代表卡的toString是有用的: 像这样的东西:

假设您有一个列表或一组卡片:

public void showCards() {
   for (Card card : cards) {
       System.out.println(card);
   }
}

并在卡片中:

public class Card {

   private String suit;
   private int rank;

   public String toString() {
       return rank + " of " + suit;
   }

   //...the rest of the code   
} 

在CreateCardDeck中添加一个getter:

public CardSTack getCardStack() {
    return cardStack; 
}

然后在你的主要添加:

c.getCardStack().showCards();