设计树状结构的接口

时间:2015-07-24 08:07:24

标签: c# interface tree

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

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; }
    /* ... */
}

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用泛型:

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