我有一个班级Node
:
class Node
{
public string Name { get; private set; }
public Node Parent { get; private set; }
... // some more fields and methods
}
在我的程序开始时,我有一些Node
个对象,其Parent
个字段都为空。在我的程序过程中,除了一个节点之外的所有节点都将获得父集。但由于它取决于外部因素,我不知道何时会发生这种情况。
现在我有一些Node
A
并希望运行以下代码:
Node n = A;
while (!n.HasCertainProperty()) // some method returning a bool
n = n.Parent;
DoStuffWith(n); // some method processing n
如何延迟命令n = n.Parent
,直到n.Parent
不再为空?
(我的算法是n
永远不会是那个没有获得父级的Node
;即保证n.Parent != null
在某些地方true
为Node
指出未来。)
这是我的解决方案草图:
首先,我们通过添加事件机制来修改class Node
{
public string Name { get; private set; }
public event EventHandler OnParentSet;
private Node _parent;
public Node Parent
{
get { return _parent; }
private set
{
_parent = value;
OnParentSet?.Invoke(this, EventArgs.Empty);
}
}
... // some more fields and methods
}
类:
void MyMethod(Node A)
{
Node n = A;
if (n.HasCertainProperty())
DoStuffWith(n);
else
{
if (n.Parent == null)
A.OnParentSet += (o, e) => { RunWhenParentIsSet(n); };
else
RunWhenParentIsSet(n);
}
}
void RunWhenParentIsSet(Node n)
{
n = n.Parent;
MyMethod(n);
}
然后我们使用以下两种方法代替上面的代码:
Season
但是我不喜欢这个解决方案,因为我必须将while循环转换为递归。是否有办法在不需要转换的情况下或多或少地保留原始代码?