【问题标题】:How can I change a property to a different value, every time I create a new object from that class?每次从该类创建新对象时,如何将属性更改为不同的值?
【发布时间】:2017-08-25 05:47:19
【问题描述】:

今天我用 C# 开始了一个控制台项目。 我的想法是为标准一副 52 张卡片中的每张卡片设置一个类。 我现在正在实施我的第一张卡片“Two”,所以这张卡片的价值为 2。 问题是一副牌包含 4 张“Two's”牌,任何“颜色”不同(例如,梅花、菱形、红心、黑桃)。所以我必须跟踪我稍后将创建的卡片对象上的颜色。 我完全不知道该怎么做?

我用谷歌搜索了一下,我的想法是每次创建新对象时都以某种方式切换颜色:
club --> diamond --> hearth --> spade
(然后从我创建第二副牌时开始),因为二十一点游戏包含 6 x 一副 52 张牌。

到目前为止,这是我的课:

class Two : ICard // thats the card with the value of "One"; 
{
    // in a deck of 52 cards there are 4 cards with "Two" in each color: club, diamond, heart, spade

    public string Name { get => Name;  private set => Name = value; }
    public int Value { get => Value;  private set => Value = value; }
    public int MaxIncludedInDeck { get => MaxIncludedInDeck; private set => MaxIncludedInDeck = value; }
    public string CardColor { get => CardColor; private set => CardColor = value; }

    public Two()
    {
        Name = "One";
        Value = 1;
        MaxIncludedInDeck = 4;

        // TODO: Figure out how to set one object to club, one to diamond, one to hearth and one to spade


    }
}

它只是用相同的方法实现了一个接口(我正在通过使用一个接口来练习 OOP)。

也许您可以引导我走向正确的方向,并告诉我一些如何解决该问题的想法? 提前致谢!

【问题讨论】:

  • 为什么你应该有一个用于二、三、...的类,而不仅仅是一个具有可以是二、三的 Value 属性的 Card 类
  • 执行此操作的经典方法是有一个 Card 类,具有 Rank 和 Suit 属性
  • 所以你的想法是创建一个卡片类,然后给它一个值和颜色的属性?然后用 for 循环实例化一个包含大量此类卡片的牌组,并且每次我更改传递给构造函数的变量时?
  • 您可能会混淆类和实例的概念。一个类定义了一种事物的类型(例如具有属性 Value 和 Suit 的 Card),而该事物的每个实例都是该类的实例,具有自己的属性值(例如 Value = 2 且 Suit = Spades 的 Card)。定义一个 Card 类(如 Ashkan 所述),然后创建(“新建”)您需要的该类的许多实例,这听起来像是您正在寻找的方向。
  • 哇,我太慢了。是的,GeraltDieSocke,这听起来像是一个好的开始。 :-)

标签: c# object properties


【解决方案1】:

你可以这样做: 使用将颜色和值作为参数的构造函数创建一个 Card 类。还要创建一个包含所有 52 张卡片的 Deck 类,它将负责实例化您的卡片。您可以在下面找到一些示例代码。

public enum CardColor
{
    Club =0,
    Diamond =1,
    Hearth  = 2,
    Spade = 3
}
public class Card
{
    public CardColor CardColor { get; set; }
    public int Value {get;set;}

    public Card(CardColor cardColor,int value) {
        CardColor = cardColor;
        Value = value;
    }
}

public class Deck
{
    public List<Card> Cards { get; set; } = new List<Card>();
    //also instead on having a method to initialize the Deck you can do that
    // in the constructor of the Deck class
    public void InitilizeDeck()
    {
        foreach (var cardColor in Enum.GetValues(typeof(CardColor))) {
            for (int i = 1; i<=10;i++)
            {
                Cards.Add(new Card((CardColor)cardColor, i));
            }
        }
    }
}

  //then use the Deck class like that
  var deck = new Deck();
  deck.InitilizeDeck();
  var cards = deck.Cards;

【讨论】:

  • 好吧,这很聪明。谢谢。我对您的代码有一个小问题。我浏览了每一行并阅读了 Enum 的文档(我显然对编程很陌生:P),这对我来说很有意义。我不明白的 sn-p 是这样的: (CardColor)cardColor - 你能向我解释一下这到底是做什么的吗?根据文档,我会这样尝试:Cards.Add(new Card(CardColor.cardColor, i));
  • 此时 cardColor 变量被视为对象类型,我们需要帮助编译器理解这是 CardColor 类型,所以我正在对 CardColor (CardColor)cardColor 进行强制转换变量前面的括号是进行强制转换的地方。请在此处查看文档docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2021-06-07
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2012-11-03
  • 2021-12-06
相关资源
最近更新 更多