【问题标题】:Best way to implement parent child relationship实现父子关系的最佳方式
【发布时间】:2013-11-05 14:45:03
【问题描述】:

我正在开发一个 CAD 应用程序,其中有块实体。每个块实体都有一个子实体列表。 When these entities are rendered, every block entity knows about its child entity (as it can figure out the child entity in the list), and hence when block entity is selected, the whole block entity along with its child entities gets selected.但是,子实体不知道该块的父块和其他子实体,并且由于选择了子实体时,我无法将整个块实体以及所选的所有子实体一起获取。

为了解决这个问题,我在子实体中创建了一个属性来保存父块实体的引用。但是,交叉引用可能会出现一些问题,并使我的数据结构容易出错。

例如:有一个复制命令,几天后处理这些数据结构的人可能只是在创建子实体的副本时复制同一个父实体。但是,新副本应该属于其他父块。

请提出更好的方法来实现这种关系,以便在选择子实体时我可以选择整个块实体及其所有子实体。

public class BlockEntity
{
    public List<ChildEntity> Children = new List<ChildEntity>();
}

public class ChildEntity
{
    public readonly BlockEntity Parent;
}

【问题讨论】:

  • 寻找脱节的集合结构和联合查找算法

标签: c# hittest


【解决方案1】:

我最近遇到了这个问题。我和其他与我交谈的人提出了两个选择:

  1. 利用Parent&lt;--&gt;Child 关系做你正在做的事情,双方都彼此了解。
  2. 拥有Parent--&gt;Child 关系,并让所有事情都由父母处理。

两者都是可行的解决方案,但都有各自的问题。第一种情况,你正在做的事情,似乎更好,Microsoft 似乎将其与 TreeView/TreeNodeDataTable/DataRow/etc. 对象一起使用,因为它们都可以引用各自的父对象。

可能会向父级添加约束,例如不允许直接访问父级的子集合,但只允许您可以在其中进行必要链接的AddChild 函数。或者按照@Irfan 的建议去做,让孩子要求你将父母传递给它的构造函数。也限制您的复制方法,但始终记录所有内容以消除尽可能多的混乱。

上述示例中的后面的示例更容易一些,因为总是从父级访问所有内容。这是我们的解决方案。我们在 parent 中有许多功能来检查和管理其中的孩子。因此,在这种情况下,您可以在 CAD 应用程序中选择孩子,然后去父母那里检查他们的收藏以查看孩子是否存在。如果是,则选择父级和其余子级。

这取决于您,但在每种情况下,您都需要添加约束和错误检查,以确保事情以尽可能接近您想要的方式发生。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    通过创建对父级的引用,您会遇到哪些引用问题?有了这个只能在对象构造期间设置的只读引用,我觉得一点问题都没有。

    构造器(我相信你知道)看起来像:

    public ChildEntity(BlockEntity p)
    {
      Parent = p;
    }
    //Test just to show Parent can not be assigned elsewhere
    public void test()
    {
    //this line below will show compile error
      Parent = new BlockEntity();
    }
    

    你认为这会有什么问题吗?该列表是一个松散的引用,因此没有堆栈溢出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 2013-12-04
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多