读一本书:NHibernate 3: Beginners guide我发现了一个令我好奇的片段:
行动时间 - 创建基础实体
(...)
- 将新类添加到项目的文件夹域中,并将其命名为Entity。在T中使类成为抽象和通用的。您的代码应类似于以下代码片段:
醇>
using System;
namespace OrderingSystem.Domain
{
public abstract class Entity<T> where T : Entity<T>
{ }
}
我的问题是:片段where T : Entity<T>
是什么意思?
我理解类型where
上的T
部分can be applied to add constraints,但上面的代码似乎永远无法实例化此类(如果它不是抽象的话) )。
答案 0 :(得分:30)
这很可能是为返回(或接收)更多派生类型的实例的方法提供额外的类型安全性,从而使调用者不必将结果强制转换为派生类型。
abstract class Cloneable<T> where T : Cloneable<T>
{
public abstract T Clone();
}
sealed class MyCloneable : Cloneable<MyCloneable>
{
public override MyCloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = instance.Clone();
修改强>
根据@ siride的评论,这被称为奇怪的重复模板模式。 Eric Lippert在C#中写了一篇很棒的文章:
https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/
P.S。并且只是为了说明如果你要取消通用约束,上面的例子会是什么样子:
abstract class Cloneable
{
public abstract Cloneable Clone();
}
sealed class MyCloneable : Cloneable
{
public override Cloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = (MyCloneable)instance.Clone(); // Note the cast.