我看到一些c#asp.net源代码编写如下:
public class EntityInstanceContext<TEntityType> : EntityInstanceContext
{
/// <summary>
/// Initializes a new instance of the <see cref="EntityInstanceContext{TEntityType}"/> class.
/// </summary>
public EntityInstanceContext()
: base()
{
}
任何人都可以帮助我理解为什么泛型类型是非泛型的子类吗?以这种方式设计的好处是什么?
答案 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;
}
}
然后我意识到我想为该类型制作工厂类方法
这样我就可以成功地挂钩到类型推理系统,当我不必这样做时,不要指定T1
和T2
:
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<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}}不同。