2015-07-20 74 views
3
名單

我有代表因此分層數據結構的名稱IHierachicalItem如下界面通用和非通用接口 - T的

public interface IHierachicalItem 
{ 
    IHierachicalItem Parent { get; set; } 
    IList<IHierachicalItem> Children { get; set; } 
} 

現在我有多個類,從這個接口繼承:

public class HierachicalItemA : IHierachicalItem 
{ 
    public IHierachicalItem Parent { get; set; } 
    public IList<IHierachicalItem> Children { get; set; } 
} 

public class HierachicalItemB : IHierachicalItem 
{ 
    public IHierachicalItem Parent { get; set; } 
    public IList<IHierachicalItem> Children { get; set; } 
} 

public class HierachicalItemC : IHierachicalItem 
{ 
    public IHierachicalItem Parent { get; set; } 
    public IList<IHierachicalItem> Children { get; set; } 
} 

我想擴展接口,以便類訪問其父級和子級屬性時返回相同的類而不是接口。所以我想過使用一個通用接口:

public interface IHierachicalItem<T> : IHierachicalItem 
{ 
    new T Parent { get; set; } 
    new IList<T> Children { get; set; } 
} 

現在我面對的,我只希望有孩子的一個實例,不叫像.OfType.ToList()的問題。 我該如何做到這一點?

public class HierachicalItemB : IHierachicalItem<HierachicalItemB> 
{ 
    IHierachicalItem IHierachicalItem.Parent { get { return this.Parent as IHierachicalItem; } set { this.Parent = (HierachicalItemB)value; } } 
    IList<IHierachicalItem> IHierachicalItem.Children { get { return this.Children.OfType<IHierachicalItem>().ToList(); } set { this.Children = value.OfType<HierachicalItemB>().ToList(); } } 

    public HierachicalItemB Parent { get; set; } 
    public IList<HierachicalItemB> Children { get; set; } 
} 

我還可以這樣用.Cast <>而不是.OfType <>但這並不改變的事實,我會打電話給.ToList(),或者如果接口會說,它的ObersavbleCollection一次又一次初始化一個新的ObservableCollection,有什麼想法?

回答

1

你不能。您的IHierachicalItem界面需要簽名爲IList<IHierachicalItem> Children的房產,而IHierachicalItem<T>則需要IList<T> Children。你需要實現兩個屬性。這對你的其他財產也是一樣的。

這就是爲什麼您需要隱式接口實現來告訴編譯器遵從兩個接口。除了刪除其中一個接口之外,沒有辦法解決這個問題。

注:我想你應該T限制在IHierachicalItem<T>類型:

public interface IHierachicalItem<T> : IHierachicalItem where T : IHierachicalItem