2011-04-27 42 views
0

我想用this關鍵字或類似typeof(this)東西在我的通用接口的where限制,但顯然這不是正確的(沒有編譯)。有沒有一種方法可以做到這一點,我不知道?想做IGenericInterface <T>其中T:ISomethingElse <typeof(this)> //i.e。 typeof運算的實現類

interface IParent<TChild> where TChild : IChildOf<typeof(this)> 
{ 

    void AddRange(TChild children){} 

} 

interface IChildOf<TParent> : IDisposable 
{ 
    TParent Parent { get; } 
} 

還是我必須做

interface IParent<TChild, T2> where TChild : IChildOf<T2> 

,只是知道T2將是實現該接口的類?

+1

在您嘗試使用的環境中,「this」沒有意義。 – 2011-04-27 01:32:37

+0

嗨,你想完成什麼?每個節點有多個孩子的樹結構? – 2011-04-27 01:56:17

回答

6

好奇地重複通用模式可以用在這裏:

interface IParent<TChild, TParent> 
    where TChild : IChildOf<TParent> 
    where TParent : IParent<TChild, TParent> 
{ 
    void AddRange(TChild children); 
} 

可是我最好seriously consider re-evaluating your design。你真的需要這個嗎?

+0

+1,極具參考 – BrokenGlass 2011-04-27 02:49:47

+0

+1,標誌着回答,我最終只是完全移除TParnet只有做IParent 。謝謝。 – dFlat 2011-05-02 00:55:46

+0

@dFlat:很高興聽到您的設計更改。我已經完成了C#多年,大量使用泛型,但僅使用CRGP一次。 :) – 2011-05-02 02:44:56

1

我認爲你唯一的選擇是:

interface IParent<TChild, TParent> where TChild : IChildOf<TParent> 
{ 
    void AddRange(TChild children); 
} 

您只能使用在類型約束的類型參數或已知的編譯時間類型的通用接口,所以這是你能做的最好的。

0

看來你想建立一個樹結構,其中每個節點有多個孩子。你可以這樣說:

interface INode 
{ 
    List<INode> Children { get; } 
    void AddRange(IEnumerable<INode> children); 
} 

class Node : INode 
{ 
    List<INode> Children { get; private set; } 

    void AddRange(IEnumerable<INode> children) 
    { 
     Children.AddRange(children); 
    } 
} 
相關問題