2011-06-20 26 views
0

假設我有一個手柄類,如:有沒有什麼辦法可以在C#4中使用新的co/contravariance來實現這種類型的層次結構?

interface IHasHandle<TObject> { 
    IHandle<TObject> Handle { get; } 
} 

interface IHandle<out TObject> { 
    TObject Value { get; } 
} 

我想使用這個類來給我的層次來派生輸出類型。我有現在的樣子:

interface IAnimal : IHasHandle<IAnimal> { ... } 

interface IMammal : IAnimal, IHasHandle<IMammal> { ... } 

interface IFeline : IMammal, IHasHandle<IFeline> { ... } 

class Tiger : IFeline { 
    IHandle<IAnimal> IHasHandle<IAnimal>.Handle { get { ... } } 
    IHandle<IMammal> IHasHandle<IMammal>.Handle { get { ... } } 
    IHandle<IFeline> IHasHandle<IFeline>.Handle { get { ... } } 
    public IHandle<Tiger> Handle { get { ... } } 
} 

這意味着,當我有一個IAnimal,我總是可以得到IHandle,當我有IMammal,我可以得到IHandle等

沒有人有任何一般對於這種結構或想法如何避免每一個可能的實現提出意見?

+0

依賴注入?只是一個想法。 – Andrew

回答

0

即使.NET 4.0之前,有可能做這樣的事情:

interface IAnimal<TSpecies> : IHasHandle<TSpecies> where TSpecies : IAnimal<TSpecies> { ... } 

interface IMammal<TSpecies> : IAnimal<TSpecies> where TSpecies : IMammal<TSpecies> { ... } 

interface IFeline<TSpecies> : IMammal<TSpecies> where TSpecies : IFeline<TSpecies> { ... } 

class Tiger : IFeline<Tiger> { 
    IHandle<Tiger> IHasHandle<Tiger>.Handle { get { ... } } 
} 

當然,這不會阻止你做一些class EvilCat : IFeline<Tiger>,但它提供了擺脫的相當的好方法在Tiger中的額外不需要的Handle實現。如果您在本示例代碼中將IHasHandle泛型參數聲明爲out 1,則可以將Tiger(其實現IHasHandle<Tiger>)轉換爲IHasHandle<IMammal>

相關問題