【问题标题】:C# generics: what's the point of the "X<T> where T: X<T>" generic type constraint?C#泛型:“X<T> where T: X<T>”泛型类型约束有什么意义?
【发布时间】:2016-02-13 22:11:43
【问题描述】:

看书:NHibernate 3: Beginners guide发现了一个让我好奇的片段:

实战时间——创建基础实体

(...)

  1. 在项目的文件夹域中添加一个新类并将其命名为实体。使 T 中的类抽象和通用。您的代码应类似于以下代码 sn-p:
 using System;

 namespace OrderingSystem.Domain
 {
     public abstract class Entity<T> where T : Entity<T>
     { }
 }

我的问题是:片段where T : Entity&lt;T&gt; 的意义何在?

我知道T 类型上的where 部分can be applied to add constraints,但上面的代码看起来永远不可能实例化这样的类(如果它不是抽象的话)。

【问题讨论】:

标签: c# generics


【解决方案1】:

这很可能是为了为返回(或接受)派生更多类型的实例的方法提供额外的类型安全性,从而使调用者不必将结果强制转换为派生更多的类型。

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/

附:并且只是为了说明如果您要取消通用约束,上面的示例会是什么样子:

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.

【讨论】:

猜你喜欢
  • 2017-01-21
  • 2023-03-11
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2012-02-10
  • 2019-02-02
相关资源
最近更新 更多