C#嵌套类访问父成员

时间:2009-07-09 19:23:13

标签: c# oop

是否可以访问子类中的父成员...

class MainClass {
  class A { Whatever }

  class B {
    List<A> SubSetList;

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

  List<A> MasterList;
}

所以...我的主要课程将有一个主列表。它也会有一堆B实例。在B的每个实例中,我想向特定的B添加新的A,但只有它们存在于主列表中。我玩弄MasterList是静态的,它可以工作......直到我有多个MainClass实例......我将拥有它。

我可以将对MasterList的引用传递给B的每个实例,但我最终会有多个这些“MasterLists”,如果我不需要,我不想传递大量的引用。

6 个答案:

答案 0 :(得分:25)

您可以使用以下内容:


class B {
    private MainClass instance;

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

    List SubSetList;

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

答案 1 :(得分:24)

在C#中,实际上没有对封闭类的实例的隐式引用,因此您需要传递这样的引用,并且通过嵌套类的构造函数执行此操作的典型方法。

答案 2 :(得分:5)

根据您的定义,class B的实例可以访问class MainClass的私有方法和静态字段。

答案 3 :(得分:1)

无论你是否在A类中嵌套B类,A的任何给定实例仍然需要知道它所持有的B实例。因此,您可能希望使用对B的引用初始化A并将其保留在字段中。这可能包括取消嵌套。

答案 4 :(得分:1)

是的,但您需要在B实例中引用MainClass实例。

你有没有想过重新上课?如果在B中使用AddNewItem方法,您可以在MainClass中使用它。这样就可以很容易地从MainClass中检查MasterList。

答案 5 :(得分:1)

这可能对您有用:

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;
}