Циклическая зависимость в C#, это дизайн запах?

class A
{
    public B b { get; set; }
    public void Ma()
    {
        b.Mb();
    }
}

class B
{
    B()
    {
        A a = new A();
        a.b = this; 
    }
    public void Mb()
    {
    }
}

в данном сценарии я создаю объект класса A в классе B и передаю текущий объект B в A.
У меня 3 вопроса
1. Есть ли циклическая зависимость между обоими классами?
2. Это дизайнерский запах?
3. если это дизайнерский запах, как решить его?

1 ответ

Решение

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

Как A заинтересован только в Mb функция B а не в самом объекте, простое решение вашей проблемы без циклических зависимостей будет:

class A
{
    public Action BAction { get; set; }
    public void Ma()
    {
        if (BAction != null)
            BAction();
    }
}

class B
{
    B()
    {
        A a = new A {BAction = Mb};
    }
    public void Mb()
    {
    }
}
Другие вопросы по тегам