我正在开发自定义树。每个节点(BindingNode是我如何调用它们)包含一个BindingNodeCollection,它实现ICollection并包含更多节点。我的问题是,用户应该能够使用名为Parent的只读属性访问每个节点的父节点,就像在TreeNode中一样。但是通过调用BindingNodeCollection的Add(BindingNode node)
方法将节点添加到BindingNodeCollection中。 BindingNodeCollection知道它自己的父是什么,但是,不能在Add(BindingNode node)
方法中分配BindingNode的Parent,因为Parent应该是readonly。我试图实现的功能与TreeNode中TreeNodeCollection和TreeView的功能基本相同:
-TreeNode的Parent是readonly。
通过调用TreeNodeCollection的Add(TreeNode node)
方法将-TreeNodes分配给TreeNodeCollection。
-TreeNode的Parent给出TreeNode,其中包含添加了TreeNode的TreeNodeCollection。
-TreeNodeCollection未在TreeNode中定义,以便可以访问父私有字段。
这是我想念C ++的friend
。 :(
答案 0 :(得分:2)
内部修饰符是C#等同于友元类,以使Parent的SET方法只能访问同一程序集中的类。
TreeNode Parent { get; internal set;}
答案 1 :(得分:2)
有几种方法可以实现您所追求的目标,这实际上取决于您想要的安全性。这是一个只有您或您的同事会触摸的图书馆或“封闭式”应用程序吗?在与他们合作之前,请考虑以下一些建议和问题。
使BindingNode上的属性设置器为内部设置; 你相信大会中的每个人都不是孤儿吗?
将BindingNodeCollection公开为ReadOnly并提供修改集合的方法 在BindingNode本身。 Add可以设置私有Parent属性。需要删除才能将Parent属性设置为null。 这是非常被锁定的,污染你的基类节点值得安心吗?
接受透明度比安全性更重要,并将Parent setter公开为public。 您是否相信所有人可以看到您的课程不会孤儿?
为了进一步阅读和更好的想法,你几乎所描述的是Composite Pattern。关于此模式的安全性与透明性的讨论存在 TON ,其中大部分涉及公开这些类以供公众在某些API中使用。对你的情况来说可能有点过头了,或者你可能正是你需要考虑的事情,我不知道你的问题是什么范围。
答案 2 :(得分:1)
我认为它被称为装饰模式?如果我是对的,请来点。我永远记不起模式的名字..
我创建了一个在add中构造的类,并且在构造中设置了Parent属性,并且只将该节点作为成员拥有。如果有BindingNode的接口,那么我将实现具有所有方法的接口,并将属性传递给实际的BindingNode。
public class BoundNode : INode
{
private INode _thisNode { get; private set; }
public INode Parent { get; private set; }
public BoundNode(INode bindingNode, INode parent)
{
_thisNode = bindingNode;
Parent = parent;
}
// Implement pass throughs to the _thisNode member
}
然后add方法将实现
public Add(INode someNode)
{
_nodeList.Add(new BoundNode(someNode, this.Parent));
}
或类似的东西..但是你的收藏品知道它的节点上下文..
答案 3 :(得分:1)
public class BindingNode
{
private BindingNode _parent;
private List<BindingNode> _children = new List<BindingNode>();
public IEnumerable<BindingNode> Children
{
get { return _children; }
}
public BindingNode Parent
{
get { return _parent; }
}
public void AddChild( BindingNode node )
{
node._parent = this;
_children.Add( node );
}
}
答案 4 :(得分:0)
正确的方法是将子节点分配给父节点。 像这样:
parentTreeNode.Nodes.Add(childTreeNode);