閱讀,當我遇到這個通用類,定義跌跌撞撞[如果你不感興趣的背景跳到問題]一天,這難倒我了一段時間:
public abstract class Entity<T> where T : Entity<T>
我困惑的是如何T
上Entity<T>
本身可以是Entity<T>
。這似乎是某種奇怪的遞歸約束。
我才明白,這個約束可以通過子類(這是當然的,什麼abstract
要求很高之類的)來滿足:
public class Deriver : Entity<Deriver>
這裏,類型T
的保證下,爲類型Entity<T>
因爲Deriver
派生自Entity<Deriver>
。
問題
總之,它使我懷疑,如果類是不是抽象的,我們可以直接instantitate呢?
因此,考慮
class Entity<T> where T : Entity<T>
我們可以直接instantitate Entity<T>
?
顯然,我們不能說:
Entity<SomeClass> e = new Entity<SomeClass>();
因爲SomeClass
不滿足約束where T : Entity<T>
。
忽略顯而易見的「你爲什麼想這麼做?」這基本上是一種確保在不使用abstract
關鍵字之前就可以使用它的方法嗎?
我把它叫做「型系統地獄」 :) – Ankur 2013-02-15 10:57:56
埃裏克利珀的經典博客文章的主題:http://blogs.msdn.com/b/ericlippert/archive/2011/ 02/03 /奇怪之和 - curiouser.aspx。 TL; DR:不,它不是用來派生的(「抽象」已經做得很好)。它被用作在涉及類層次結構的某些情況下提供類型安全性的嘗試。 – Jon 2013-02-15 11:07:51