0

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

namespace CircularDependency_1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new A(); 
      B b = new B(); 
      Console.WriteLine("executed"); 
      Console.ReadLine(); 
     } 
    } 

    public class B 
    { 
     public A a; 

     public B() 
     { 
      a = new A(); 
      Console.WriteLine("Creating B"); 
     } 
    } 

    public class A 
    { 
     public B b; 

     public A() 
     {  
      b = new B(); 
      Console.WriteLine("Creating A"); 
     } 
    } 

    public class C 
    { 
     public A a; 
     public B b; 

     public C() 
     { 
      a = new A(); 
      b = new B(); 
      Console.WriteLine("Creating C"); 
     } 
    } 

} 
+1

почему 'new'-ing' A' и ' B' в конструкторе другого? Каковы причины этого? Что он должен делать? Вам просто нужен экземпляр 1 и 1B, и они ссылаются друг на друга? Без этой информации ваш вопрос просто: у меня есть класс 'class A {A() {new A(); }} 'и как его исправить? Нет значимого ответа –

ответ

0

Это не зависимость, вы создаете его в конструкторе. Вы должны держать A и B конструкторы пусто, и сделать что-то подобное в C:

public class C 
    { 
     public A a; 
     public B b; 

     public C() 
     { 
      a = new A(); 
      b = new B(); 
      a.setB(b); 
      b.setA(a); 
     } 
    } 

В другой стороны, вы должны проверить, если вы действительно должны иметь эту двойную ссылку.

EDIT: Я вижу, что вы на самом деле не с помощью класса C. Если вы хотите сделать это в основном то же самое:

static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 
     a.setB(b); 
     b.setA(a); 
    } 
+0

все еще исключение stackoverflow будет –

+0

mmm, nope, why? – leoxs

1

Вы не должны new'ing свои объекты. Вместо этого вам нужно передать их в качестве аргументов конструктору. Вам нужно реорганизовать код:

public class A { 
    B _b; 
    public A(B b) { 
    _b = b; 
    Console.WriteLine("Creating A"); 
    } 
} 
public class B { 
    A _a; 
    public B(A a) { 
    _a = a; 
    Console.WriteLine("Creating B"); 
    } 
} 
public class C { 
    A _a; 
    B _b; 
    public C (A a, B b) { 
    _a = a; 
    _b = b; 
    Console.WriteLine("Creating C"); 
    } 
} 

Затем вам нужно реорганизовать функции из А (или В) в другой класс D:

public class A { 
    D _d; 
    public A(D d) { 
    _d = d; 
    Console.WriteLine("Creating A"); 
    } 
} 
public class B { 
    A _a; 
    D _d; 
    public B(A a, D d) { 
    _a = a; 
    _d = d; 
    Console.WriteLine("Creating B"); 
    } 
} 

public class C { 
    A _a; 
    B _b; 
    public C (A a, B b) { 
    _a = a; 
    _b = b; 
    Console.WriteLine("Creating C"); 
    } 
} 

public class D { 
    public D() { 
    Console.WriteLine("Creating D"); 
    } 
} 

Вы можете создать объекты как

D d = new D(); 
A a = new A(d); 
B b = new B(a, d); 
C c = new C(a, b); 
Console.WriteLine("executed"); 
Console.ReadLine(); 

См. Circular Dependency in constructors and Dependency Injection о том, как реорганизовать ваши классы, чтобы удалить круговые ссылки