c#中的自引用泛型继承

时间:2013-09-18 10:57:39

标签: c# odata

我看到一些c#asp.net源代码编写如下:

public class EntityInstanceContext<TEntityType> : EntityInstanceContext
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EntityInstanceContext{TEntityType}"/> class.
    /// </summary>
    public EntityInstanceContext()
        : base()
    {
    }

任何人都可以帮助我理解为什么泛型类型是非泛型的子类吗?以这种方式设计的好处是什么?

1 个答案:

答案 0 :(得分:2)

.NET TypeSystem非常强大。 想象一下以下场景。我正在编写一个名为MyTuple的类,它是BCL Tuple类的编码很差的克隆:

public class MyTuple<T1, T2> {
    public T1 Item1 { get; private set; }
    public T2 Item2 { get; private set; }

    public MyTuple(T1 item1, T2 item2) {
        this.Item1 = item1;
        this.Item2 = item2;
    }
}

然后我意识到我想为该类型制作工厂类方法 这样我就可以成功地挂钩到类型推理系统,当我不必这样做时,不要指定T1T2

new MyTuple<int, string>(123, "test"); // which is also a bit redundant

所以我正在编写我在课堂上讨论的方法,让我们调用类Factory

public class Factory {

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }

}

这样,写作时我会更开心:

var tuple = Factory.Create(123, "test"); // and tuple is inferred to be of <int, string>

现在如果我将Factory重命名为MyTuple会发生什么:

public class MyTuple {

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }

}

简而言之:没什么不好

我现在有两种完全不同的类型:

  • MyTuple(非通用)
  • MyTuple&lt; T1,T2&gt;

它们没有任何共同点,它们是不同的类型。

我是否可以说MyTuple<T1, T2>恰好延伸MyTuple? 好吧,只要MyTuple既不是static也不是sealed是的,确定

public class MyTuple { ... }
public class MyTuple<T1, T2> : MyTuple { ... }

因此,在您的情况下,Mammal延长Animal或...... Tiger延长Mammal仅此而已。 这与Mammal of a weirder sort Mammal of a good ol' classical sort {{1}}不同。