2013-06-30 91 views
7

我與泛型約束實驗。當一個類聲明的約束像這樣:C#接口約束上

public class DocumentPrinter<T> where T : IFooDoc 

我能夠在DocumentPrinter類的方法內訪問由IFooDoc聲明的方法。但是,如果我做DocumentPrinter落實聲明該限制的接口,例如:

public interface IDocumentPrinter<T> where T : IFooDoc 
{ 
    void Add(T fooDoc); 
    void PrintFoos(); 
} 

然後聲明DocumentPrinter像這樣:

public class DocumentPrinter<T>: IDocumentPrinter<T> 

性能/ IFooDoc實例的方法不再是方法中可用的文檔打印機。看來,如果我要訪問類型聲明的成員,我必須明確地聲明一個類本身的接口約束。

我是否正確理解這一點還是可以聲明接口上的約束和有約束由類實現呢?

回答

8

我是否正確理解這一點,或者是否有可能在接口上聲明約束並讓該類實現該約束?

正確。您 申報約束的類型參數的泛型類爲好。僅僅因爲你在DocumentPrinter<T>命名的類型參數具有相同的名稱作爲IDocumentPrinter<T>類型參數並不意味着它們是相同的類型。當你聲明

public class DocumentPrinter<T> : IDocumentPrinter<T> 

你實際上說使用T是參數化DocumentPrinter<T>參數化IDocumentPrinter<T>現在他們是同一類型。但要做到合法,TDocumentPrinter<T>必須滿足的類型參數的所有約束IDocumentPrinter<T>。因此,你必須明確地說,T滿足T : IFooDoc

:顯然我需要明確說明這一點。如果你不執行語言規範要求你做的事情,你的代碼將不能編譯。語言規範要求在參數化泛型類型時,使用參數化類型必須滿足該泛型類型的該類型參數的所有約束。如果你不這樣做,你的代碼將不能編譯。

+0

這是誤導性的,你不必爲該類添加約束來訪問成員,你必須添加它以供代碼編譯。 – svick

+0

@svick:上面提到的問題是「*我是否正確理解了這個問題,或者是否有可能在接口上聲明約束條件並讓該類約束得到該約束?」不確定我的答案是如何誤導的。如果你必須在我的答案中聲明約束條件*,那麼就有一個隱含的*,如果你不這樣做,那麼代碼將不會編譯*因爲任何時候你不會做某種語言*需要*你做的事情,你有代碼不會編譯。但是,問題是,我必須這樣做,還是有辦法做到這一點,而不是明確的。*我回答了這個問題。 Downovting? – jason

+0

這個問題說:「我似乎必須顯式聲明一個接口約束類本身*如果我要訪問類型聲明的成員*。」對我來說,這表明OP *沒有實現代碼獲得編譯*。這就是爲什麼我認爲強調這一點很重要。 – svick

3

性能/ IFooDoc實例的方法不再是文檔打印機

井的方法中使用,它是一種無關緊要的東西智能感知告訴你當你的代碼不能編譯

如果要實施IDocumentPrinter<T>,則您的必須以滿足其約束條件。如果你不這樣做,你的代碼將不能編譯。