Wywołanie obiektu, który nie jest do końca utworzony

0

Cześć, wyobraźcie sobie taką sytuację:
Mamy obiekt A - który jest singletonem (ale tak naprawdę nie musi nim być, nie ma różnicy) i w konstruktorze tworzy obiekt B:

class A
{
  public event EventHandler MyEvent;

  B b;

  //pomijam właściwość Instance
  A()
  {
    b = new B();
  }
}

Następnie w klasie B w konstruktorze mamy:

B()
{
  A.Instance.MyEvent += MyEventHandler;
}

Tu oczywiście będzie stack overflow. Ktoś może powiedzieć, że "to wina singletona". OK, zróbmy to bez singletona:

Konstruktor klasy B będzie teraz wyglądał tak:

B(A a)
{
  a.MyEvent += MyEventHandler;
}

a konstruktor klasy A tak:

A()
{
  b = new B(this);
}

I teoretycznie wszystko jest w porządku. Ale co w sytuacji, gdy klasa B odwołuje się do innego obiektu z klasy A?

class A
{
  B b;
  public MyClass obj { get; private set; }

 A()
 {
   b = new B(this);
   obj = new MyClass();
 }
}

class B
{
  public B(A a)
  {
     a.obj.DoSth();
  }
}

Oczywiście można powiedzieć: "Twórz obj przed obiektem B". Ale co jeśli takich zależności jest więcej? W końcu będzie to nie do ogarnięcia. Czy jest jakiś sposób, żeby poradzić sobie z tym problemem poprawnie?

No bo inne rzeczy, jakie wpadają do głowy to np. późna inicjalizacja:

A()
{
  b = new B(this);
  obj = new MyClass();

  b.Init();
}

Ale co, jeśli obj też musi się jakoś inicjalizować? Znowu jesteśmy zależni od kolejności tworzenia obiektów w konstruktorze. Więc jest jakiś dobry sposób na ogarnięcie takiego problemu?

0

Klasy nie powinny być od siebie zależne w takim stopniu - zazwyczaj oznacza to błąd w architekturze aplikacji.

Przykładowym rozwiązaniem może być utworzenie trzeciej klasy zawierającej te informacje, które są wymagane przez dwie poprzednie, lecz to też nie zawsze będzie czytelne.

Możesz podać konkretny przypadek?

2

To jest dość podobne do MVP gdzie widok zależy od prezentera i vice versa. Rozwiązanie tego jest bardzo proste - robi się metodę SetView lub SetPresenter i to załatwia sprawę.
Uważam, że do rozwiązanie twojego problemu winno być analogiczne.

Pozdr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1