Подтвердить что ты не робот

Член родительского доступа с закрытым классом С#

Можно ли получить доступ к родительскому элементу в дочернем классе...

class MainClass {
  class A { Whatever }

  class B {
    List<A> SubSetList;

    public void AddNewItem(A NewItem) {
       Check MasterListHere ????
    }
  }

  List<A> MasterList;
}

Итак... у моего основного класса будет основной список. Он также будет иметь множество экземпляров B. В каждом экземпляре B я хочу добавить новый A в конкретный B, но только если они существуют в главном списке. Я играл с статикой MasterList, и она работает... пока у меня не будет более одного экземпляра MainClass..., который у меня будет.

Я могу передать ссылку на MasterList каждому экземпляру B, но в конечном итоге у меня будет несколько этих "мастер-списков", и я не хочу передавать много ссылок, если мне это не нужно.

4b9b3361

Ответ 1

Вы можете использовать что-то вроде этого:


class B {
    private MainClass instance;

    public B(MainClass instance)
    {
        this.instance = instance;
    }

    List SubSetList;

    public void AddNewItem(A NewItem) {
       Check MasterListHere ????
    }
  }

Ответ 2

В С# на самом деле нет неявной ссылки на экземпляр окружающего класса, поэтому вам нужно передать такую ​​ссылку, и типичный способ сделать это через конструктор вложенного класса.

Ответ 3

С помощью вашего определения экземпляры class B могут обращаться к приватным методам и статическим полям class MainClass.

Ответ 4

Независимо от того, вставите ли вы класс B внутри класса A, любой данный экземпляр A все равно должен знать о экземпляре B, в котором он хранится. Поэтому вы можете инициализировать A со ссылкой на B и сохранить его в поле. Вероятно, это включает в себя развёртывание.

Ответ 5

Да, но вам нужно будет иметь ссылку на экземпляр MainClass из вашего экземпляра B.

Думали ли вы немного переработать свои занятия? Вместо того, чтобы иметь метод AddNewItem в B, вы можете получить его в MainClass. Таким образом, было бы легко проверить MasterList из MainClass.

Ответ 6

Это может сработать для вас:

public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList)
{
    if (checkForItemInMasterList.Invoke(newItem)
        SubList.Add(newItem);
}

Тогда у вас было бы что-то в своем MainClass, чтобы использовать метод, подобный этому:

public void AddItem(A newItem)
{
    new B().AddNewItem(newItem, x => MasterList.Contains(x));
}

Подводя итог, может выглядеть примерно так:

class MainClass {
  class A { Whatever }

  class B {
    List<A> SubSetList;

    public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList)
    {
        if (checkForItemInMasterList.Invoke(newItem)
            SubList.Add(newItem);
    }
  }

  //I don't know how you're adding items to instances of B.
  //This is purely speculative.
  public void AddItem(A newItem)
  {
      new B().AddNewItem(newItem, x => MasterList.Contains(x));
  }

  List<A> MasterList;
}