2015-07-20 2 views
3

У меня есть следующий интерфейс, представляющий собой иерархическую структуру данных, отсюда и название IHierachicalItemGeneric и необщего интерфейс - Список Т

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; } 
} 

Я хотел расширить интерфейс так, чтобы классы возвращались при доступе к свойству parent и children одного и того же класса вместо интерфейса. Так я думал об использовании общего интерфейса:

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 
Смежные вопросы