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?