读一本书:NHibernate 3:初学者指南 https://www.packtpub.com/application-development/nhibernate-3-beginners-guide我发现了一个令我好奇的片段:
实践时刻 – 创建基础实体
(...)
- 将一个新类添加到项目的 Domain 文件夹中,并将其命名为 Entity。在 T 中使类抽象和通用。您的代码应类似于以下代码片段:
using System;
namespace OrderingSystem.Domain
{
public abstract class Entity<T> where T : Entity<T>
{ }
}
我的问题是:该片段的意义是什么where T : Entity<T>
?
据我了解,where
部分可以应用于添加约束 https://msdn.microsoft.com/en-us/library/bb384067.aspx在类型上T
,但是上面的代码看起来永远不可能实例化这样的类(如果它不是抽象的)。
这很可能是为了为返回(或接受)更派生类型的实例的方法提供额外的类型安全性,从而使调用者不必将结果强制转换为更派生的类型。
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();
EDIT
根据 @siride 的评论,这被称为奇怪的重复模板模式。 Eric Lippert 写了一篇关于其在 C# 中的应用的精彩文章:
https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/ https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/
附:只是为了说明如果您要取消通用约束,上面的示例会是什么样子:
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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)