【发布时间】:2010-12-12 21:22:10
【问题描述】:
我正在创建一个基于 AbstractNode 类的树结构。 AbstractNode 类具有包含其子节点的通用集合属性。请参阅下面的代码示例。
是否有某种方法(可能使用泛型)可以限制 AbstractNode 的具体版本只允许一种类型的子节点?请参阅下面的 ConcreteNodeA 代码,其中 ChildNodes 属性是 ConcreteNodeB 的集合,而不是 AbstractNode。这当然不能编译,但我想知道是否有其他方法可以达到相同的效果。
当然,一切都适用于 ChildNodes 集合属性始终是 AbstractNode 类型,但我正在尝试在我的类中嵌入一些关于什么的逻辑节点应该是其他节点的子节点。另外,在引用 ChildNodes 属性时,如果我不必将集合转换为我知道它应该是的类型的集合,那就太好了。
public abstract class AbstractNode
{
public abstract NodeCollection<AbstractNode> ChildNodes
{
get;
set;
}
}
public class ConcreteNodeA : AbstractNode
{
//THIS DOES NOT COMPLILE
//Error 1 'ConcreteNodeA.ChildNodes': type must be 'NodeCollection<AbstractNode>'
//to match overridden member 'AbstractNode.ChildNodes'
public override NodeCollection<ConcreteNodeB> ChildNodes
{
get;
set;
}
}
public class ConcreteNodeB : AbstractNode
{
public override NodeCollection<AbstractNode> ChildNodes
{
get;
set;
}
}
public class NodeCollection<T> : BindingList<T>
{
//add extra events here that notify what nodes were added, removed, or changed
}
更新
好吧,我想我知道我想做什么,但我想知道是否有人认为这“感觉不好”或“闻起来很有趣”以及为什么。而不是我的节点具有 ChildNodes 集合属性,我正在考虑使每个节点成为实际的集合。所以我的树结构实际上只是一系列集合的集合。然后,我的抽象 Node 类将使用泛型上的各种约束来控制它可以拥有的子节点的种类。
这有意义吗?我有理由不想这样做吗?我以前从未在自己的一个类中使用过泛型,所以我不确定我是否忽略了某些东西。
public interface INode
{
}
public abstract class AbsNode<T> : BindingList<T>, INode where T : INode
{
}
public abstract class AbsNodeA<T> : AbsNode<T> where T : AbsSubNodeA
{
}
public abstract class ConcreteNodeA : AbsNodeA<AbsSubNodeA>
{
}
public abstract class AbsSubNodeA : INode
{
}
public class ConcreteSubNodeA :AbsSubNodeA
{
}
public class ConcreteSubNodeB :AbsSubNodeA
{
}
【问题讨论】:
标签: c# generics data-structures tree