简体   繁体   English

通用和非通用接口 - T列表

[英]Generic and Non-Generic Interface - List of T

I have the following interface representing a hierarchical data structure hence the name IHierachicalItem 我有以下接口表示分层数据结构,因此名称为IHierachicalItem

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

Now I have multiple classes that inherits from this interface: 现在我有多个继承自此接口的类:

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

I wanted to extend the interface so that the classes return upon accessing its parent and children property the same class instead of the interface. 我想扩展接口,以便类在访问其parent和children属性时返回相同的类而不是接口。 So I thought about using a generic interface: 所以我考虑使用通用接口:

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

Now I am facing the problem that I only want to have one instance of Children and don't call something like .OfType.ToList(). 现在我面临的问题是我只想拥有一个Children实例,而不是调用类似.OfType.ToList()的东西。 How can I achieve this? 我怎样才能做到这一点?

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

I also could have used .Cast<> instead of .OfType<> but this doesn't change the the fact that I would have to call .ToList() or if the Interface would say its an ObersavbleCollection again and again init a new ObservableCollection, any ideas? 我也可以使用.Cast <>而不是.OfType <>但这不会改变我必须调用.ToList()的事实,或者如果接口会再次说出它的ObersavbleCollection并再次初始化一个新的ObservableCollection , 有任何想法吗?

You can't. 你不能。 Your IHierachicalItem interface demands a property with the signature IList<IHierachicalItem> Children , while IHierachicalItem<T> demands IList<T> Children . 您的IHierachicalItem接口需要具有签名IList<IHierachicalItem> Children的属性,而IHierachicalItem<T>需要IList<T> Children You need both properties implemented. 您需要实现这两个属性。 This is the same for your other property. 这与您的其他财产相同。

That is why you need the implicit interface implementation to tell the compiler you comply to both interfaces. 这就是为什么你需要隐式接口实现来告诉编译器你遵守这两个接口。 There is no way to workaround this, besides of dropping one of the interfaces. 除了丢弃其中一个接口之外,没有办法解决这个问题。

Note: I think you T should be restricted to the IHierachicalItem<T> type: 注:我想你T ,应仅限于IHierachicalItem<T>类型:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM