我正在尝试创建各种类型的卡片的表示,这些卡片继承自通用卡片类,并且都包含对其所属牌组的引用。
我尝试按照建议重新声明它们 here , 但它仍然不会转换为特定的卡类型。
我目前的代码是这样的:
public class Deck<T> : List<T>
where T : Card
{
void Shuffle()
{
throw new NotImplementedException("Shuffle not yet implemented.");
}
}
public class Card
{
public Deck<Card> OwningDeck { get; set; }
}
public class FooCard : Card
{
public Deck<FooCard> OwningDeck
{
get
{
return (Deck<FooCard>)base.OwningDeck;
}
set
{
OwningDeck = value;
}
}
}
我得到的编译时错误:
错误 2 无法转换类型 Game.Cards.Deck<Game.Cards.Card>
至 Game.Cards.Deck<Game.Cards.FooCard>
还有一条警告建议我使用新的运算符来指定隐藏是有意的。这样做会违反惯例吗?有没有更好的办法?
我对 stackoverflow 的问题是:我想做的事情能否在 .NET 类型系统中优雅地完成?如果是,能否提供一些例子?
最佳答案
您可以为您的卡片配备一个通用参数,该参数指定您正在使用的卡片的基类:
public class Card<TCard>
where TCard : Card<TCard>
{
public Deck<TCard> OwningDeck { get; set; }
}
你的 FooCard
类将如下所示:
public class FooCard : Card<FooCard>
与当前代码相比的一个优势可能是您不必重新声明 OwningDeck
属性(property);它自动为 Deck<FooCard>
类型在 FooCard
.
关于c# - 如何在 C# 中使用类的类型作为继承的集合属性的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556467/