Я определил C # -класс, который должен быть элементами ориентированного графа (в основном это дерево, но у элемента может быть несколько родителей - я не знаю, существует ли для этого специальное имя).
Теперь каждый элемент должен иметь всех своих детей и всех своих родителей.Он отображает эти списки как IEnumarable
public interface IMyClass
{
public IEnumerable<MyClass> Children { get; }
public IEnumerable<MyClass> Parents { get; }
}
public class MyClass : IMyClass
{
private List<MyClass> _parents;
private List<MyClass> _children;
public IEnumerable<MyClass> Children
{
get { foreach (var child in _children) yield return child; }
}
public IEnumerable<MyClass> Parents
{
get { foreach (var parent in _parents) yield return parent; }
}
При добавлении или удалении дочернего элемента к данному элементу я хочу убедиться, что данный элемент добавлен или удален в родительский список дочернего элемента также.
Первой идеей было показать только метод AddChild (MyClass theChild).Проблема в том, что я не могу добавить родителя к объекту theChild, потому что он не предоставляет метод AddParent (parent), и я не могу вызвать частные методы объекта theChild.
Поэтому я попыталсяпойти с выставлением метода AddParent (MyClass theParent) тоже.Чтобы по-прежнему удостовериться, что обе ссылки на объекты установлены, мой первый снимок вызывал AddParent / AddChild в другой функции, подобной этой:
public void AddChild(IMyClass theChild)
{
_children.Add(theChild);
theChild.AddParent(this);
}
public void AddParent(IMyClass theParent)
{
_parent.Add(theParent);
theParent.AddChild(this);
}
, но очевидно, что это смертельный цикл.
Что еще хуже, я хочу допустить, чтобы элемент мог быть дочерним по отношению к другому элементу несколько раз (это еще не требование, но я хочу убедиться, что КОГДА это требование выполняется, мой код не должен бытьтронут.)
Существуют ли какие-либо алгоритмы / стандартные подходы, которые позволяют мне убедиться, что при добавлении дочернего элемента к родителю всегда установлены обе ссылки на объекты?
Заранее спасибо,
Фрэнк
Эдит: Добавлены интерфейсы для исправления примера.