Конструкторы класса C #, создающие бесконечный цикл - PullRequest
0 голосов
/ 26 ноября 2018

Допустим, у меня есть два класса.Класс A и класс B примерно такие:

Class A
{
    B classB;

    public A
    {
        classB = new B();
    }

    public void funcIHaveToUseInClassB()
    {
    }
}

Class B
{
    A classA;

    public B
    {
        classA = new A();
    }

    public void funcIHaveToUseInClassA()
    {
    }
}

Как видите, оба класса содержат функции, которые необходимо использовать в другом классе.У класса A есть функция, которую должен использовать класс B, и наоборот.Нет, я не могу просто поместить функции в другой класс, потому что они сильно зависят от того класса, в котором они находятся. Так как бы я поступил так?С моим методом я создаю бесконечный цикл и получаю исключение переполнения стека.Я надеюсь, что кто-то может помочь мне, спасибо заранее.

РЕДАКТИРОВАТЬ: Люди спрашивают меня, почему мне нужно, чтобы эти два класса полагались друг на друга, вот оно: Класс А управляет всемэто связано с элементом управления WebBrowser и классом B. Управляет всем, что связано с определенной страницей в моей программе.Класс A используется несколькими страницами, поэтому он должен быть отдельным классом.Классу А иногда требуется передать информацию в класс В. Классу Б иногда требуется информация из элемента управления WebBrowser, которым управляет класс А. Именно поэтому он вызывает функцию.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Превратите classB и classA в открытые свойства и инициализируйте их из другого класса вместо конструктора.

class A
{
  public B classB { get; set; }

  public void funcIHaveToUseInClassB()
  {
  }

  public void anotherF()
  {
     classB.funcIHaveToUseInClassA();
  }
}

class B
{
   public A classA { get; set; }

   public void funcIHaveToUseInClassA() 
   {
   }

   public void anotherF()
   {
      classA.funcIHaveToUseInClassB();
   }
}


static void main()
{
    // entry point
    var a = new A();
    var b = new B();
    a.classB = b;
    b.classA = a;
    // do what ever you want with a and b
}
0 голосов
/ 26 ноября 2018

Передавайте вашу справку из B / A в A / B каждый раз, когда вам нужно ее использовать.Вам не нужны конструкторы.

Class A
{
    public void funcIHaveToUseFromClassB(B classB)
    {
    }
}

Class B
{
    public void funcIHaveToUseFromClassA(A classA)
    {
    }
}
0 голосов
/ 26 ноября 2018

Вам нужно передать экземпляр одного из ваших классов в конструктор другого класса.Попробуйте это:

Class A
{
    B classB;

    public A()
    {
        classB = new B(this);
    }

    public void funcIHaveToUseInClassB()
    {
    }
}

Class B
{
    A classA;

    public B(A arg)
    {
         classA = arg;
    }

    public void funcIHaveToUseInClassA()
    {
    }
}

Обновить

Или просто передать экземпляр в качестве параметра для методов, как в ответе Мэтта Якобсена.

0 голосов
/ 26 ноября 2018

Создайте частный и общедоступный метод доступа и создайте экземпляр свойства только тогда, когда частный объект имеет значение null, например:

class A
{
  private B _b;
  public B b {
    get {
      if (_b == null) _b = new B();
      return _b;
    }
  }

  // Constructor can now be empty
  public A()
  {
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...