【发布时间】:2012-09-24 05:59:23
【问题描述】:
我正在尝试创建从通用卡片类继承的各种卡片的表示形式,并且所有卡片都包含对其拥有的牌组的引用。
我尝试按照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 类型系统中优雅地完成吗?如果有,可以举一些例子吗?
【问题讨论】:
-
我会让卡片成为简单的不可变对象,没有反向引用。
-
如果可能,派生类将违反 Liskov 替换原则,因为 Card 的任何消费者都希望 FooCard 对象的行为类似于 Card 类型,因此 OwningDeck 的类型为 Deck
。使用“new”不会解决您的问题,因为 Card.OwningDeck 将在该类上被破坏,或者 OwningDeck 将意味着两种不同的事情,具体取决于您将对象视为 Card 还是 FooCard (我不确定哪个会发生)。
标签: c# .net inheritance covariance type-systems