假设我有两个类都具有与树结构相关的属性:它们具有父节点和相同类型的子节点。
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; }
}
但是要实现界面,ParentNode
和ChildNodes
必须引用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; }
/* ... */
}
我不想要,因为我失去了父节点和子节点与节点类型相同的合同。
我该如何解决这个问题?如何设计和实现通用树节点的接口?
答案 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; }
}