簡體   English   中英

C#泛型:“X”的重點是什么 <T> 其中T:X <T> “泛型約束?

[英]C# generics: what's the point of the “X<T> where T: X<T>” generic type constraint?

讀一本書: NHibernate 3:初學者指南我發現了一個令我好奇的片段:

行動時間 - 創建基礎實體

(......)

  1. 將新類添加到項目的文件夾域,並將其命名為Entity。 在T中使類成為抽象和泛型。您的代碼應類似於以下代碼片段:
 using System;

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

我的問題是: where T : Entity<T>的片段where T : Entity<T>什么意義?

我知道where部分可以應用於在類型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();

編輯

根據@ siride的評論,這被稱為奇怪的重復模板模式。 Eric Lippert撰寫了一篇關於它在C#中的應用的精彩文章:

https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/

PS並且只是為了說明如果你要刪除泛型約束,上面的例子會是什么樣子:

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM