Ссылка с подсчетом ссылок имеет две семантики: она действует как доля владения, а также как средство навигации по графу объектов.
Как правило, вам не нужно обе этой семантики для всех ссылок в цикле в графе ссылок. Может быть, только родители имеют детей, а не наоборот? В этом случае вы можете сделать дочерние ссылки на родительские слабые ссылки , сохранив их как указатели, например:
TChildClass = class(TInterfacedObject, Interface2)
private
fParent : Pointer;
function GetParent: Interface1;
public
constructor Create(aPArent : Interface1);
property Parent: Interface1 read GetParent;
end;
function TChildClass.GetParent: Interface1;
begin
Result := Interface1(fParent);
end;
constructor TChildClass.Create(AParent: Interface1);
begin
fParent := Pointer(AParent);
end;
Это безопасно, если корень дерева экземпляров гарантированно где-то сохраняется, т. Е. Вы не полагаетесь только на то, что сохраняете ссылку на ветку дерева и все еще можете перемещаться по нему целиком. 1010 *