Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#嵌套类访问父成员_C#_Oop - Fatal编程技术网

C#嵌套类访问父成员

C#嵌套类访问父成员,c#,oop,C#,Oop,是否可以访问子类中的父成员 class MainClass { class A { Whatever } class B { List<A> SubSetList; public void AddNewItem(A NewItem) { Check MasterListHere ???? } } List<A> MasterList; } class类main类{ A类{无论什么} B类{ 列表子列表; pub

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

class MainClass {
  class A { Whatever }

  class B {
    List<A> SubSetList;

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

  List<A> MasterList;
}
class类main类{
A类{无论什么}
B类{
列表子列表;
public void AddNewItem(新项){
在这里查看主列表????
}
}
列表主列表;
}
所以。。。我的主课将有一个总名单。它还将有一组B的实例。在每个B的实例中,我想向特定的B添加新的a,但前提是它们存在于主列表中。我玩弄了使主列表保持静态,它工作了。。。直到我有多个MainClass实例。。。我会的


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

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

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

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


你有没有想过重新上课?I除了在B中有AddNewItem方法外,您还可以在MainClass中有它。这样就很容易从MainClass中查看主列表。

您可以使用以下内容:


class B {
    private MainClass instance;

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

    List SubSetList;

    public void AddNewItem(A NewItem) {
       Check MasterListHere ????
    }
  }
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;
}

这可能适合您:

public void AddNewItem(A newItem, Func<A, bool> checkForItemInMasterList)
{
    if (checkForItemInMasterList.Invoke(newItem)
        SubList.Add(newItem);
}
总而言之,它可能是这样的:


class B {
    private MainClass instance;

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

    List SubSetList;

    public void AddNewItem(A NewItem) {
       Check MasterListHere ????
    }
  }
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;
}
class类main类{
A类{无论什么}
B类{
列表子列表;
public void AddNewItem(一个newItem,Func checkForItemInMasterList)
{
if(checkForItemInMasterList.Invoke)(newItem)
子列表.添加(新项);
}
}
//我不知道您如何将项添加到B的实例中。
//这纯粹是推测。
公共无效附加项(新项)
{
new B().AddNewItem(newItem,x=>MasterList.Contains(x));
}
列表主列表;
}

在C#中,实际上没有对封闭类实例的隐式引用,因此需要传递这样的引用,一种典型的方法是通过嵌套类的构造函数来传递引用。

但是仍然需要传递对instance@Jeremy:在编辑过程中发现我:)我也认为。。。是否有一个访问修饰符可以限制对嵌套类的访问?一种方法是将所有这些数据结构放入它们自己的程序集中,并使用内部而不是私有。我考虑过这一点,但这并不阻止其他类访问此列表。这不是超级关键,但我希望这是尽可能干净的…然后我认为Alex的解决方案可以。问题是,我将有多个B实例,我将添加一个项目…我正在考虑做类似的事情,但也包括对B的引用。。所以public void AddItem(B list,A item){}..@Rob多个实例都可以,在这种情况下,您只需更改在Main类中添加项的方式,但这样您就不必担心B知道您的主列表。这是一个遗憾,因为这意味着类也不是namspace,与C++不同,为什么这个精确的答案比接受的答案少,这不能解释任何事情,我们必须实际阅读和解释代码示例来理解解决方案吗?