如何防止通用树中的循环依赖?

问题描述 投票:0回答:1

我有一个 C# 类,名为 Pose。它的功能并不重要,但它包含另一个名为 _parent 的 Pose 和一个名为 _children 的列表作为字段。在 _parent 的 setter 中,我需要确保设置父级不会导致循环依赖,因为这最终会导致其他方法中的无限递归循环。

public Pose Parent
{
    get => _parent;
    set 
    {
        if (WouldCauseCircularDependency(value)) throw new ArgumentException("Cannot set a parent that causes a circular dependency");

        _parent?._children.Remove(this);

        _parent = value;
        _parent?._children.Add(this);
        MarkPoseDirty();
    }
}

bool WouldCauseCircularDependency(Pose potentialParent)
{
    return false; // TODO
}

我怎样才能实现我的WouldCauseCircularDependency()方法来防止这种情况?

我不太确定这样做所需的逻辑。

编辑:也许我已经在这里回答了我自己的问题,但我是否只需要检查潜在的父母是否已经是当前姿势的孩子(或孙子等)?

c# unity-game-engine recursion tree infinite-loop
1个回答
0
投票

是的。将其视为两个操作:分离和附加。分离树的一个分支后,您将拥有两棵独立的树。现在是把一棵树附加到另一棵树上,所以附加到它自己肯定是错误的。

实施方面

  • 选项 1 是仅递归检查自身和子级是否不是新的父级
  • 选项 2 是从字面上脱离旧父级,而是检查新父级是否存在于主树的其余节点中。
© www.soinside.com 2019 - 2024. All rights reserved.