我正在創建基於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集合屬性,我正在考慮讓每個節點成爲實際的集合。所以我的樹結構實際上只是一系列的集合。然後,我的抽象節點類將使用泛型上的各種約束來控制它可能具有的子節點的種類。
這是否有意義?我不想這樣做是有原因的嗎?我從未在自己的類中使用過泛型,因此我不確定是否忽視了某些東西。
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
{
}
是啊,這就是我,除了可能存在思維是一個等價的「T」部分在一個具體的Node類中明確地將T設置爲其他具體的節點類型 – 2009-11-04 06:23:56
我同意這種「感覺真的很糟糕」,但是有人可以給出一個更確切的理由,爲什麼我會或不想要做這樣的事情? – 2009-11-04 17:30:12
也想想組合設計模式,這是你正在嘗試做的事情(http://www.dofactory.com/patterns/patterncomposite.aspx#_self1) – mike 2009-11-04 23:32:10