假设我有一个抽象基类Deck:
public abstract class Deck
{
public List<Card> cards;
public Deck(string[] values, string[] suits)
{...}
...
}
和一个派生类 EuchreDeck:
public class EuchreDeck : Deck
{
string[] values = new string[] { "9", "10", "J", "Q", "K", "A" };
string[] suits = new string[] { "clubs", "spades", "hearts", "diamonds" };
public EuchreDeck() : base(values, suits) // Error.
{}
...
}
我希望能够实例化
EuchreDeck
并将两个字符串数组传递给基类,即 var gameDeck = new EuchreDeck();
。目前我收到错误消息:“非静态字段、方法或属性
EuchreDeck.values
需要对象引用。”这是可能的,还是调用派生的默认构造函数总是调用基本的默认构造函数?
最佳答案
是的,如果你制作数组 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
,它们不再通过实例访问,而是通过 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
有特殊需求;我假设您还有其他与之相关的方法?如果没有,您可能可以完全放弃该类(class),而让工厂使用所需的卡片创建一个 Deck
。