【问题标题】:Designing interface for tree-like structure设计树状结构的接口
【发布时间】:2015-07-24 08:07:23
【问题描述】:

假设我有两个类,它们都具有与树结构相关的属性:它们具有相同类型的父节点和子节点。

public class FooNode
{
    FooNode ParentNode { get; set; }
    ICollection<FooNode> ChildNodes { get; set; }
    /* ... */
}

public class BarNode
{
    BarNode ParentNode { get; set; }
    ICollection<BarNode> ChildNodes { get; set; }
    /* ... */
}

我想设计一个界面来描述结构。我想出了这个:

public interface ITreeNode
{
    ITreeValue ParentNode { get; set; }
    ICollection<ITreeValue> ChildNodes { get; set; }
}

但是要实现接口,ParentNodeChildNodes 必须引用ITreeNode 类型而不是实现。因此我不能:

public class FooNode : ITreeNode
{
    FooNode ParentNode { get; set; }
    ICollection<FooNode> ChildNodes { get; set; }
    /* ... */
}

界面强迫我这样做:

public class FooNode : ITreeNode
{
    ITreeNode ParentNode { get; set; }
    ICollection<ITreeNode> ChildNodes { get; set; }
    /* ... */
}

这是我不想要的,因为我失去了父节点和子节点与节点具有相同类型的合同。

我应该如何解决这个问题?如何设计和实现通用树节点的接口?

【问题讨论】:

    标签: c# interface tree


    【解决方案1】:

    你可以使用泛型:

    public interface ITreeNode<T> where T : ITreeNode<T>
    {
        T ParentNode { get; set; }
        ICollection<T> ChildNodes { get; set; }
    }
    
    public class FooNode : ITreeNode<FooNode>
    {
        public FooNode ParentNode { get; set; }
        public ICollection<FooNode> ChildNodes { get; set; }
    }
    

    【讨论】:

    • 微不足道,我应该想到的。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2021-10-02
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多