【发布时间】:2014-07-17 21:04:32
【问题描述】:
我有以下情况:
我需要创建一个树状结构,一旦实例化,它就是不可变的。例如,考虑一个列表方法的列表。问题是在构建过程中,我需要能够插入节点。所以我需要某种允许插入节点的私有接口,而这个结构的公共接口只允许检索它们。我试过这个:
public partial class TreeLike {
public SomeType1 SomeTreeProperty1 { get; private set; }
public SomeType2 SomeTreeProperty2 { get; private set; }
private List<NodeLike> _Nodes = new List<NodeLike>();
public ReadOnlyCollection<NodeLike> Nodes {
get {
return _Nodes.AsReadOnly();
}
}
}
public class NodeLike {
public SomeType1 SomeNodeProperty { get; private set; }
private List<NodeLike> _Children = new List<NodeLike>();
public ReadOnlyCollection<NodeLike> Children {
get {
return _Children.AsReadOnly();
}
}
public partial class TreeLike {
public SomeType3 SomeTreeProperty3 { get; private set; }
TreeLike() {
NodeLike n0 = new NodeLike();
NodeLike n1 = new NodeLike();
n0._Children.Add(n1);
_Nodes.Add(n0);
}
}
}
这个问题(除了在NodeLike 中继续TreeLike 的声明/定义有点hackysh 外观)是,虽然它有效,但TreeLike 的SomeTreeProperty3 对外部世界不可见。也就是说,如果我在最外层范围创建TreeLike 的实例,我只能访问第一个在部分类的“全局”范围声明中声明的属性。
所以我想知道是否有办法让在局部类的嵌套延续中声明的属性和方法仍然对全局范围可见(因此,这个类的客户端)。或者,如果不是,那么更好的 C# 惯用方式是什么? 也许创建类的不可变版本?
【问题讨论】:
标签: c# partial-classes