所以你需要跟蹤節點訪問時你在樹中的位置。爲了能夠做到這一點,你需要引入某種上下文。
事情是這樣的:
public class VisitContext
{
// Visited node
public VisitedType Visited { get; set; }
// Visited node is the left child node
public bool IsLeftNode { get; set; }
// Visited node is the right child node
public bool IsRightNode { get; set; }
}
所以訪問者得到這個合同:
public interface IVisitor
{
public void Visit(VisitContext context);
}
現在你只需要遍歷它。關鍵是要有一個受保護的超載,告訴孩子他們是哪種類型的。請注意遞歸調用。
public class VisitedType
{
public void Accept(IVisitor visitor)
{
var context = new VisitContext{ Visited = this };
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
}
protected void AcceptAsLeft(VisitContext context)
{
context.IsLeftNode=true;
context.IsRightNode=false;
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
}
protected void AcceptAsRight(VisitContext context)
{
context.IsLeftNode=false;
context.IsRightNode=true;
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
}
}
現在你知道你什麼時候在樹上左右移動,但是你仍然不知道樹在哪裏。要做到這一點,我們來介紹一下跟蹤我們當前路徑的血統/麪包屑。
public class VisitContext
{
public VisitedType Visited { get; set; }
public bool IsLeftNode { get; set; }
public bool IsRightNode { get; set; }
// this.
public LinkedList<VisitedType> Lineage { get; set; }
}
而且更新訪問類型:
public class VisitedType
{
public void Accept(IVisitor visitor)
{
var context = new VisitContext{ Visited = this, Lineage = new LinkedList<VisitedType>() };
context.Lineage.AddLast(this);
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
}
protected void AcceptAsLeft(VisitContext context)
{
//add a bread crumb
context.Lineage.AddLast(this);
context.IsLeftNode=true;
context.IsRightNode=false;
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
//remove us when we've visited our children
context.Lineage.RemoveLast();
}
protected void AcceptAsRight(VisitContext context)
{
//add a bread crumb
context.Lineage.AddLast(this);
context.IsLeftNode=false;
context.IsRightNode=true;
visitor.Visit(context);
_leftNode.AcceptAsLeft(context);
_rightNode.AcceptAsRight(context);
//remove us when we've visited our children
context.Lineage.RemoveLast();
}
}
現在,你應該能夠跟蹤通過層級的訪問。這可以通過遞歸調用來實現,它將在遍歷層次結構時繼續構建麪包屑。
檢查您是否完成訪問子節點?你什麼意思?是不是在'''.accept()'''調用結束時完成了?你是否在異步執行它? –