Два класса с конструкторами, чтобы они ссылались друг на друга? - PullRequest
0 голосов
/ 06 июля 2011

У меня такое ощущение, что это запах кода, и я мог бы сделать это лучше, и если это так, укажите это.

class main
{
  void main()
  {
    object A
    object B

    A = new SystemA(ref B)
    B = new SystemB(ref A)
   }
}
class SystemA
{
  SystemB B;
  public SystemA (ref B)
  {
    this.B = B;
  }
}
class SystemB
{
  SystemA A;
  public SystemA (ref A)
  {
    this.A = A;
  }
}

В основном мне нужно инициализировать два класса со ссылками друг на друга.

Это не работает, и генерируется исключение нулевой ссылки для полей классов в двух дочерних классах, когда к ним позднее получают доступ после инициализации.

Я понимаю, что, возможно, смогу установить их после инициализации, но это добавляет больше вздора, которого я бы хотел избежать, поскольку я рассматриваю эти назначения как действия по инициализации.

1 Ответ

3 голосов
/ 06 июля 2011

Если вы дадите код, который на самом деле скомпилирован, я подозреваю, что он просто закончится с SystemA сохранением ссылки на null - потому что это значение B при построении A.

Наличие двух классов, которым нужна ссылка друг на друга, определенно является запахом кода, но вы просто не можете заставить их оба ссылаться друг на друга, если только один из них не создает другой и не передает " это ", например

class SystemA
{
    private readonly SystemB systemB;

    public SystemA()
    {
        systemB = new SystemB(this);
    }
}

class SystemB
{
    private readonly SystemA systemA;

    public SystemB(SystemA systemA)
    {
        this.systemA = systemA;
    }
}

Теперь, если вам понадобится доступ к обоим значениям впоследствии, вы можете либо поместить свойство в одно из них, дающее доступ к другому, либо (и это действительно противно) использовать параметр out в конструктор:

public SystemA(out systemB)
{
    systemB = new SystemB(this);
    this.systemB = systemB;
}

Тогда назовите это как:

SystemB b;
SystemA a = new SystemA(out b);

Пожалуйста, не делайте этого.

...