是的,如果你制作数组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# specification 10.10.1 Constructor Initializers,它指出:
实例构造函数初始化程序无法访问正在被调用的实例
创建。因此,在
构造函数初始化器的参数表达式,因为它是
引用任何参数表达式的编译时错误
通过简单名称的实例成员。
通过将数组切换为static,它们不再通过实例访问,而是通过EuchreDecktype。
也就是说,我可能会建议您对设计稍作调整。也许使用工厂为您而不是它们的构造器创建这些专门的套牌。
作为一个示例,也许重构如下:
将你的基础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。