Учитывая, что у вас есть следующий класс (плохой С#, но вы получаете дрейф):
public abstract class AmICircular
{
// assume Children is never null
private List<AmICircular> Children {get;set;}
// assume target is never null
public void Add(AmICircular target)
{
target.PerformCircularReferenceCheck(this);
Children.Add(target);
}
// throws when a circular reference is detected
protected abstract void PerformCircularReferenceCheck(AmICircular target);
}
Как бы вы реализовали PerformCircularReferenceCheck? И нет, это не домашнее задание.
Наивная реализация, imo, должна была выполнить контрольную проверку на this
и всех дочерних, а затем вызвать PerformCircularReferenceCheck на target
, передав this
. Но мне интересно, есть ли более эффективные, эффективные способы сделать это, например, добавить метод свернуть все дерево детей ссылок для this
и target
, а затем изучить результаты (меньшее давление на стек?), или, возможно, полностью избежать проверки, используя другую (возможно, самоконтрольную!) коллекцию, отличную от List <T> ?
Как вы это сделаете?
edit: Как указал Стефан, нужно только определить, достижимо ли это целевым