通用和非通用接口 - T

时间:2015-07-20 13:38:25

标签: c# generics

我有以下界面表示分层数据结构,因此名称 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,那么任何想法?

1 个答案:

答案 0 :(得分:1)

你做不到。您的IHierachicalItem界面要求使用签名为IList<IHierachicalItem> Children的媒体资源,而IHierachicalItem<T>则要求IList<T> Children。您需要实现这两个属性。这与您的其他财产相同。

这就是为什么你需要隐式接口实现来告诉编译器你遵守这两个接口。除了删除其中一个接口之外,没有办法解决这个问题。

注意:我认为T应限制为IHierachicalItem<T>类型:

public interface IHierachicalItem<T> : IHierachicalItem where T : IHierachicalItem
相关问题