У меня такая ситуация:
Мне нужно создать древовидную структуру, которая после создания экземпляра является неизменной. Подумайте, например, о подходе со списком. Проблема в том, что во время строительства мне нужно иметь возможность вставлять узлы. Поэтому мне нужен какой-то частный интерфейс, который позволяет вставлять узлы, в то время как открытый интерфейс этой структуры позволяет только их извлекать. Я пробовал это:
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);
}
}
}
Проблема с этим (помимо несколько хакерского вида продолжения объявления / определения TreeLike
внутри NodeLike
) заключается в том, что пока он работает, SomeTreeProperty3
из TreeLike
не виден внешнему миру. То есть, если я создаю экземпляр TreeLike
в самой внешней области, я могу получить доступ только к первым свойствам, которые объявлены в объявлении «глобальной» области частичного класса.
Поэтому мне интересно, есть ли способ, чтобы свойства и методы, объявленные во вложенном продолжении частичного класса, оставались видимыми для глобальной области (и, следовательно, для клиентов этого класса). Или, если нет, что может быть лучше C # -идиоматический способ сделать это? Может быть, создать неизменяемые версии классов?
NodeLike
конструктор, который берет другойNodeLike
и добавляет его как дочерний? - person Mike Zboray   schedule 18.07.2014TreeLike
иNodeLike.TreeLike
- два разных класса. Модификаторpartial
в этом случае ничего не делает. - person Groo   schedule 18.07.2014