我正在创建一个二十一点游戏,到目前为止我已经制作了一个卡片类。卡片类可以工作,但是当我在测试时测试我的卡类时,异常应该被捕获,因为" X"不在值数组中但由于某种原因它不会捕获并显示X而不是错误消息" Invalid Input"。我想要发生的是我的值集访问器应该搜索String [] values数组,然后确定value参数是否有效,如果它不是,那么抛出一个新的异常。我不知道如何解决这个问题。另外,我不能使用枚举来获取我需要使用values数组的值。
任何帮助将不胜感激
以下是我的卡片课程
class Card
{
public enum SUIT { HEARTS, SPADES, DIAMONDS, CLUBS };
private SUIT _suit;
private String _value;
public Card(SUIT suit, String value)
{
_suit = suit;
_value = value;
}
public SUIT Suit
{
get
{
//Return member variable value
return _suit;
}
set
{
_suit = value;
}
}
private String[] values = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
public String Value
{
get { return _value; }
set
{
if (!values.Contains(value))
{
throw new ArgumentException("Invalid Input");
}
_value = value;
}
}
}
以下是我正在测试的代码
try
{
Card testCard1 = new Card(Card.SUIT.SPADES, "Q");
Console.WriteLine(testCard1.Suit + " " + testCard1.Value);
Card testCard2 = new Card(Card.SUIT.DIAMONDS, "10");
Console.WriteLine(testCard2.Suit + " " + testCard2.Value);
Card testCard3 = new Card(Card.SUIT.DIAMONDS, "X");
Console.WriteLine(testCard3.Suit + " " + testCard3.Value);
}
catch (ArgumentException e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
答案 0 :(得分:6)
您正在通过构造函数将不正确的值分配给支持域。这不是一件坏事,但它会绕过你的属性。
public Card(SUIT suit, String value)
{
_suit = suit;
_value = value; // this assignes the value directly to the field, bypassing your property-logic.
}
像这样改变,这将是最简单的解决方案
public Card(SUIT suit, String value)
{
_suit = suit;
Value = value; // use the property here.
}
答案 1 :(得分:1)
您在Value
中编写了set
的检查逻辑,但是在您的代码中,您在构造函数中传递X
,这将分配给私有成员变量(从而完全避免你写的漂亮的过滤器逻辑。)
您应该在构造函数中分配属性,如下所示:
public Card(SUIT suit, String value)
{
Suit = suit;
Value = value;
}