总共两个类,一个控制台程序入口Card类:public class Card
{
      public readonly Suit suit;
      public readonly Rank rank;
      public override string ToString()
      {
         return "The " + rank + " of " + suit + "s";
      }
      private Card()
      {
      }
      public Card(Suit newSuit, Rank newRank)
      {
         suit = newSuit;
         rank = newRank;
      }
}Deck类public class Deck
{           
public Deck()
{
cards = new Card[52];
for (int suitVal = 0; suitVal < 4; suitVal++)
{
for (int rankVal = 1; rankVal < 14; rankVal++)
{
cards[suitVal * 13 + rankVal -1] = new Card((Suit)suitVal,(Rank)rankVal);
}
}
} private Card[] cards; public Card GetCard(int cardNum)
{
if (cardNum >= 0 && cardNum <= 51)
return cards[cardNum];
}
}
控制台程序入口:static void Main(string[] args)
{
Deck myDeck = new Deck();
myDeck.Shuffle();
for (int i = 0; i < 52; i++)
{
Card tempCard = myDeck.GetCard(i);
Console.Write(tempCard.ToString());
if (i != 51)
Console.Write(", ");
else
Console.WriteLine();
}
}
我有两个问题:
一,我不明白其中Deck类的字段为什么可以这样定义private card[] cards?
    二,为什么可以直接周用Card类中的重写的ToString方法?

解决方案 »

  1.   

    一、这是展示类直接一对多的关系, 一个Deck类的实例,包含多个Card实例
    二、因为关键字 override 重写了基类的ToString方法,所以调用的时候,就是调用Card类的ToString了
      

  2.   

    一、这是展示类之间一对多的关系, 一个Deck类的实例,包含多个Card实例
    ----------------
    Sorry,笔误
      

  3.   

    我还是不太明白,
    一,一个Deck类的实例,包含多个Card实例完全可以这样写Card[] cards = new Card[52]; 跟那个字段有什么关系了?二,它并没有实例化Card类为什么可以调用Card类中的ToString()方法?
      

  4.   

    private Card[] cards;
    cards = new Card[52];
    不就是Card[] cards = new Card[52]吗?只是这样声明 作用域在整个类里面。Card tempCard = myDeck.GetCard(i);
    GetCard(i)返回了一个Card对象。
      

  5.   

    Deck类里面,是先定义的 cards 实例数组,作为私有成员,然后再初始化的 cards数组
    你看到的 private Card [] cards,就是声明一个私有数组。但是并没有初始化,正真初始化的地方,是在Deck类的构造函数:public Deck(),里面第一行cards = new Card[52];
    二,它并没有实例化Card类为什么可以调用Card类中的ToString()方法
    ------------------------------------------------------------
    其实有实例化,就在Deck类的构造函数里面:cards = new Card[52];
      

  6.   

    1. private Card[] cards;  //数组成员声明,空间的分配放到了Deck()里,
    2. 
    Card tempCard = myDeck.GetCard(i);
    Console.Write(tempCard.ToString());   //不是在这调用的吗?tempCard是Card的对象,所以能调用
      

  7.   

    for循环里面的语句,就是陆续生成Card实例,并填充到cards数组里面。
      

  8.   

    第一个问题是定义多个对像,你先看一下数组,2、tempCard是Card类的一个实例,当然可以调用Card类的ToString()对像
      

  9.   

    感谢各位的帮助,,小弟懂了,,特别感谢"kugou123"讲解的很详细!!