C # Как обеспечить автоматическую двойную связь между двумя объектами - PullRequest
0 голосов
/ 04 марта 2019

Цель состоит в том, чтобы обеспечить двойную связь между объектами, т. Е. Если я свяжу объект A с объектом B, то объект B должен быть автоматически связан с объектом A.

Одно из потенциальных применений такой системы можетмоделировать неориентированный граф.

Я придумал только такую ​​глупую реализацию:

class ObjA
{
   public _addLink (object Obj)
   {
      <add code to store the single link to Obj>
   }
   public addLink (object Obj)
   {
      _addLink(Obj);
      Obj._addLink(this);
   }
} 

class ObjB
{
   public _addLink (object Obj)
   {
      <add code to store the single link to Obj>
   }
   public addLink (object Obj)
   {
      _addLink(Obj);
      Obj._addLink(this);
   }
} 

Тогда я могу написать

ObjA.addLink(ObjB)

Но проблема в том, что вв этом случае я также могу сделать

ObjA._addLink(ObjB)

И система ломается, т.е. ObjB не получает ссылку на ObjA.И я не могу сделать _addLink приватным, так как он не будет виден с другого объекта.

Какой лучший способ добиться этого?

1 Ответ

0 голосов
/ 04 марта 2019

Обратите внимание, что вы уверены, что вы пытаетесь сделать, но вы можете сделать следующее с базовым классом, т. Е. Дуэльным связыванием, с частной областью, если необходимо

public class BaseLink 
{
   private BaseLink Link { get; set; }

   protected virtual void AddLink (BaseLink obj)
   {
      Link = obj;
      Link.AddLink(obj);

   }
}
public class ObjA : BaseLink
{

} 

public class ObjB : BaseLink
{
   public void Add(BaseLink baseLink)
   {
      AddLink(baseLink);
   }
} 

// or

public class ObjB : BaseLink
{
   public ObjB(BaseLink baseLink) => AddLink(baseLink); 
} 
...