是的,如果你制作数组,你可以这样做static
:
public class EuchreDeck : Deck
{
private static readonly string[] values = new string[] { "9", "10", "J", "Q", "K", "A" };
private static readonly string[] suits = new string[] { "clubs", "spades", "hearts", "diamonds" };
public EuchreDeck() : base(values, suits)
{
}
}
不能像对实例级成员一样使用它的原因是这样做是不合法的。这来自C# 规范 10.10.1 Constructor Initializers,其中指出:
实例构造函数初始化程序无法访问正在创建的实例。因此,在构造函数初始化程序的参数表达式中引用 this 是编译时错误,就像参数表达式通过简单名称引用任何实例成员一样,也是编译时错误。
通过将数组切换为 be static
,它们不再通过实例访问,而是通过EuchreDeck
类型访问。
也就是说,我可能会建议您对设计稍作调整。也许使用工厂为您而不是他们的构造者创建这些专门的甲板。
举个例子,也许重构这样的东西:
改变你的基地Deck
,只拿一组卡片:
public abstract class Deck
{
public List<Card> Cards;
protected Deck(IEnumerable<Card> cards)
{
this.Cards = new List<Card>(cards);
}
}
然后像这样进行出厂设置:
public class EuchreDeck : Deck
{
private EuchreDeck(IEnumerable<Card> cards) : base(cards)
{
}
public class Factory : DeckFactory
{
private static readonly string[] Values = new string[] { "9", "10", "J", "Q", "K", "A" };
private static readonly string[] Suits = new string[] { "clubs", "spades", "hearts", "diamonds" };
public static EuchreDeck Create()
{
var cards = CreateCards(Values, Suits);
return new EuchreDeck(cards);
}
}
}
实例化/用法为:
EuchreDeck.Factory.Create();
您可以使用工厂用法。我只是将它嵌套在类中,因此您无法EuchreDeck
使用一组无效的卡片创建一个。您的DeckFactory
基础将具有您的转换方法(看起来就像您目前在Deck
构造函数中一样)
除此之外,我不确定您是否对 ; 有特殊需求EuchreDeck
。我假设您还有其他与之相关的方法?如果没有,您可能会完全放弃该课程,而让工厂Deck
使用所需的卡片创建一个。