Передача объектов в конструктор перед инициализацией - PullRequest
0 голосов
/ 12 июня 2011

У меня следующая проблема.Это простой пример некоторых классов, которые у меня есть (у каждого есть зависимости от других классов).

public Class1()
{
  public Class1(Class2 class2)
 {

 }
}

public Class2()
{
  public Class2(Class3 class3)
 {

 }
}

public Class3()
{
 public Class1 class1;
 public Class3(Class1 class1)
 {
     this.class1 = class1;
 }
}

Затем у меня есть следующий код, инициализирующий объекты.

Class1 class1 = null;
Class2 class2 = null;
Class3 class3 = null;

class3 = new Class3(class1);
class2 = new Class2(class3);
class1 = new Class1(class2);

Assert.IsNotNull(class3.class1)

Проблема IИмеется в том, что assert всегда нулевой, хотя class1 был инициализирован.У меня есть одно условие: я хочу, чтобы был создан только один экземпляр каждого класса.

Кто-нибудь может посоветовать лучший способ убедиться, что утверждение прошло.

Ответы [ 3 ]

0 голосов
/ 12 июня 2011

class1 не инициализируется своему объекту при создании class3, поэтому экземпляр класса 3 равен нулю.

Правильный способ пройти этот тест:

Class1 class1 = null;
Class2 class2 = null;
Class3 class3 = null;

class1 = new Class1();
class3 = new Class3(class1);
class2 = new Class2(class3);
class1.Class3 = class3;

Assert.IsNotNull(class3.class1)
0 голосов
/ 12 июня 2011

Изначально переменная class1 является нулевым указателем. Затем вы присваиваете ему некоторое значение, и ссылка изменяется. Но class3.class1 по-прежнему указывает на ноль.

Вы должны убедиться, что ссылка не изменяется, но значение, на которое она указывает, изменяется.

0 голосов
/ 12 июня 2011

class1 является нулевым, когда вы звоните:

class3 = new Class3(class1);

Так что, естественно, утверждение неверно. Вам нужно создать экземпляр class1, прежде чем пытаться передать его конструктору Class3.

Теперь это не тривиально, поскольку у вас есть циклические ссылки. Поэтому вам нужно сначала создать объекты, а затем исправить ссылки. Отделите конструкцию от присвоения ссылок на другие объекты.

Более того, вы не должны называть экземпляры объектов class, поскольку они являются объектами, а не классами. Различие важно.

...