通用和非通用接口 - T类型的列表

3
我有以下接口,代表一种分层数据结构,因此称为 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; }
}

我希望扩展接口,使得访问其父子属性时可以返回相同的类而不是接口。因此我考虑使用一个通用接口:

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

现在我面临的问题是,我只想拥有一个Children实例,并且不想调用像.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个回答

1
你无法这样做。你的 IHierachicalItem 接口要求一个带有签名 IList<IHierachicalItem> Children 的属性,而 IHierachicalItem<T> 要求 IList<T> Children。你需要实现这两个属性。对于其他属性也是一样。
这就是为什么你需要隐式接口实现来告诉编译器你遵循了两个接口。除了放弃其中一个接口外,没有绕过这个问题的方法。
注意:我认为你的 T 应该限制为 IHierachicalItem<T> 类型。
public interface IHierachicalItem<T> : IHierachicalItem where T : IHierachicalItem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接