实现父子关系的最佳方式

时间:2013-11-05 14:45:03

标签: c# hittest

我正在开发一个CAD应用程序,我有块实体。每个块实体都有一个子实体列表。当渲染这些实体时,每个块实体都知道其子实体(因为它可以找出列表中的子实体),因此当选择块实体时,整个块实体及其子实体被选中。但是,子实体不知道该块的父块和其他子实体,因此当选择子实体时,我无法获得整个块实体及其所有子实体。

作为对此问题的修复,我在子实体中创建了一个属性来保存父块实体的引用。但是,交叉引用可能存在一些问题,并且使我的数据结构容易出错。

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

请建议实现此关系的更好方法,以便在选择子实体时,我可以选择整个块实体及其所有子实体。

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

public class ChildEntity
{
    public readonly BlockEntity Parent;
}

2 个答案:

答案 0 :(得分:2)

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

  1. 使用Parent<-->Child关系做你正在做的事情,彼此了解彼此。
  2. 建立Parent-->Child关系,并在父母处理所有内容。
  3. 两者都是可行的解决方案,但两者都存在问题。第一种情况,你正在做的事情似乎更好,微软似乎将它与TreeView/TreeNodeDataTable/DataRow/etc.对象一起使用,因为它们每个都可以引用回各自的父母。

    可能会向父项添加约束,例如不允许直接访问父项的子集合,但只允许AddChild函数可以在其中执行必要的链接。或者做@Irfan建议并让孩子要求你将父母传递给它的构造函数。同样限制你的复制方法,但总是记录所有内容以尽可能多地混淆。

    以上示例的后面部分稍微容易一些,因为始终从父级访问所有内容。这是我们的解决方案。我们在父母中有许多功能来检查和管理其中的孩子。因此,在这种情况下,您将在CAD应用程序中选择子项,然后转到父项并检查其集合以查看子项是否存在于此处。如果是的话,你选择父母和其他孩子。

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

答案 1 :(得分:1)

通过创建对父级的引用,您将获得哪些参考问题?有了这个只能在构造物体时设置的只读参考,我发现没有任何问题。

Contructor(我相信你知道)看起来像:

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();
}

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