我有以下界面表示分层数据结构,因此名称 IHierachicalItem
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; }
}
现在我面临的问题是我只想拥有一个Child实例,而不是调用像.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&lt;&gt;而不是.OfType&lt;&gt;但是这并没有改变我必须调用.ToList()的事实,或者如果接口会再次说出它的ObersavbleCollection并且再次初始化一个新的ObservableCollection,那么任何想法?
答案 0 :(得分:1)
你做不到。您的IHierachicalItem
界面要求使用签名为IList<IHierachicalItem> Children
的媒体资源,而IHierachicalItem<T>
则要求IList<T> Children
。您需要实现这两个属性。这与您的其他财产相同。
这就是为什么你需要隐式接口实现来告诉编译器你遵守这两个接口。除了删除其中一个接口之外,没有办法解决这个问题。
注意:我认为T
应限制为IHierachicalItem<T>
类型:
public interface IHierachicalItem<T> : IHierachicalItem where T : IHierachicalItem