c# - 如何在 C# 中使用类的类型作为继承的集合属性的类型参数

标签 c# .net inheritance covariance type-systems

我正在尝试创建各种类型的卡片的表示,这些卡片继承自通用卡片类,并且都包含对其所属牌组的引用。

我尝试按照建议重新声明它们 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/

相关文章:

java - jUnit 忽略来自基类的@Test 方法

c++ - 试图为从类继承的子类编写构造函数,猜测语法,预期主表达式错误?

java - 以下 Java 代码行是什么意思

c# - 如何在 C# 中启动进程,但仅在卸载所有程序集后才运行该进程?

c# - 如何为静态类中的静态对象的属性赋值?

c# - 如何在 .NET 3.5 中重用线程

c# - 如何使用 Shell32.SHGetFileInfo 在 Windows 7 上获取文件夹图标

c# - 从列表中获取相同元素的总和

c# - Oracle DataAccess 相关 : "The invoked member is not supported in a dynamic assembly."

c# - 在 Windows 中对程序进行基准测试的最佳方法是什么?