2015-03-13 90 views
1

在我的一個寵物項目中,我發現自己使用的泛型相當多,我想知道是否有可能在泛型類中使用遞歸約束。我可以使用遞歸約束來定義泛型類

讓我們想象一下,我有以下接口

public interface IAmSpecial {} 

,並執行它可以按照各自的類來處理類

public class SpecialHandler<T> where T: IAmSpecial {} 

我想定義一個類,在任何是通用SpecialHandler

public class SpecialWrapperHandler<T> where T : SpecialHandler<SpecialT> where SpecialT: IAmSpecial 
{ 
    public SpecialWrapperHandler(T t){} 
} 

它不能編譯。我可以定義SpecialWrapperHandler類具有以下簽名

public class SpecialWrapperHandler<T> where T : SpecialHandler<IAmSpecial> 
{ 
    public SpecialWrapperHandler(T t){} 
} 

但我不能建立它,因爲任何SpecialHandler實施將關閉在一個實施IAmSpecial的一般價值。此外,我不能宣佈類似

public class SpecialWrapperHandler<SpecialHandler<T>> where T : IAmSpecial 

所以是有可能有一個C#構造,遞歸泛型約束,所以我可以在我的SpecialWrapperHandler?如果是的話,我應該使用什麼構造?如果不是,爲什麼?快速閱讀文檔中的generics chapter不會得到很多答案...

+3

嘗試採取在2個通用參數。 – 2015-03-13 15:35:26

回答

2

傳入處理程序的第二個類型參數。這樣你可以輸入兩個參數。

像這樣:

public class SpecialWrapperHandler<H, T> where H : SpecialHandler<T> where T : IAmSpecial 
{ 
    public SpecialWrapperHandler(T t){} 
} 

證明:

public class X : IAmSpecial { } 

public class XHandler : SpecialHandler<X> { } 

static void Main(string[] args) 
{ 
    X x = new X(); 
    SpecialWrapperHandler<XHandler, X> v = new SpecialWrapperHandler<XHandler, X>(x); 
} 
+0

回想起來這真的很明顯:(上層泛型必須已經知道泛型的下層關閉的類型。 – samy 2015-03-13 15:57:43