我正试图代表一个必须逐步绘制的地铁地图类型的东西(如它的成长)。
我的代码完美无缺但却难以理解。基本上它是一个带有递归节点和子节点的树结构,我的测试代码如下所示:
Children.Add(new TrackLine(800));
Children[0].Children.Add(new TrackSpot());
Children[0].Children[0].Children.Add(new TrackSplitter());
Children[0].Children[0].Children[0].Children.Add(new TrackRotate(-45));
Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackColorChange(Color.Red));
Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(100));
Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackRotate(45));
Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(200));
有没有人对如何解决这个烂摊子有任何建议?
答案 0 :(得分:1)
你正在寻找一种方法将它添加到没有孩子的最深的孩子身上吗?
class Node
{
List<Node> children ;
public void addNode( Node newNode )
{
if( children.Count > 0 )
children[0].addNode( newNode ) ; // recursive call
// to ask first child to add newNode to it
else
children.Add( newNode ) ; // just add it to the children list of THIS node
}
}
答案 1 :(得分:0)
为了使代码更具可读性,我会使用具有适当名称的变量(因为我不知道你的主题域,我的可能不合适):</ p>
Children.Add(new TrackLine(800));
var lineA = Children[0];
lineA.Children.Add(new TrackSpot());
var spotA = lineA.Children[0];
spotA.Children.Add(new TrackSplitter());
var splitterA = spotA.Children[0];
splitterA.Children.Add(new TrackRotate(-45));
var rotateNeg45 = splitterA.Children[0];
rotateNeg45.Children.Add(new TrackColorChange(Color.Red));
var colorRed = rotateNeg45.Children[0];
colorRed.Add(new TrackLine(100));
var lineB = colorRed.Children[0];
lineB.Children.Add(new TrackRotate(45));
var rotatePos45 = lineB.Children[0];
rotatePos45.Children.Add(new TrackLine(200));
var lineC = rotatePos45.Children[0];
另一种方法是使用字符串作为Children
的索引,如下所示:
Children.Add(new TrackLine(800));
Children["lineA"].Children.Add(new TrackSpot());
Children["lineA"].Children["spotA"].Children.Add(new TrackSplitter());
但是我可能不会这样做,因为管理字符串常量本身就是一团糟,可能需要更改Children
实现。