我正在开发一个CAD应用程序,我有块实体。每个块实体都有一个子实体列表。当渲染这些实体时,每个块实体都知道其子实体(因为它可以找出列表中的子实体),因此当选择块实体时,整个块实体及其子实体被选中。但是,子实体不知道该块的父块和其他子实体,因此当选择子实体时,我无法获得整个块实体及其所有子实体。
作为对此问题的修复,我在子实体中创建了一个属性来保存父块实体的引用。但是,交叉引用可能存在一些问题,并且使我的数据结构容易出错。
对于Ex:拥有一个Copy命令,从现在起几天就有人在处理这些数据结构,可能只是在创建子实体的副本时复制同一个父。但是,新副本应该属于其他一些父块。
请建议实现此关系的更好方法,以便在选择子实体时,我可以选择整个块实体及其所有子实体。
public class BlockEntity
{
public List<ChildEntity> Children = new List<ChildEntity>();
}
public class ChildEntity
{
public readonly BlockEntity Parent;
}
答案 0 :(得分:2)
我最近遇到过这个问题。我和我谈过的其他人提出了两个选择:
Parent<-->Child
关系做你正在做的事情,彼此了解彼此。Parent-->Child
关系,并在父母处理所有内容。两者都是可行的解决方案,但两者都存在问题。第一种情况,你正在做的事情似乎更好,微软似乎将它与TreeView/TreeNode
和DataTable/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();
}
你认为这会有问题吗?该列表是一个松散的引用,因此没有堆栈溢出异常。