Член родительского доступа с закрытым классом С#
Можно ли получить доступ к родительскому элементу в дочернем классе...
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, но в конечном итоге у меня будет несколько этих "мастер-списков", и я не хочу передавать много ссылок, если мне это не нужно.
Ответы
Ответ 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;
}