【问题标题】:C# Nested Class Access Parent Member [duplicate]C#嵌套类访问父成员[重复]
【发布时间】:2010-11-09 12:12:58
【问题描述】:

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

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 的每个实例,但我最终会拥有多个这样的“MasterLists”,如果我不需要,我不想传递大量的引用。

【问题讨论】:

    标签: c# oop


    【解决方案1】:

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

    【讨论】:

    • 这是一种耻辱,因为这意味着一个类不也是一个命名空间,不像在 C++ 中。
    • 为什么这个如此准确的答案比公认的答案得票少,这并不能解释任何事情,让我们必须实际阅读和解释代码示例才能理解解决方案?
    【解决方案2】:

    你可以这样使用:

    
    class B {
        private MainClass instance;
    
        public B(MainClass instance)
        {
            this.instance = instance;
        }
    
        List SubSetList;
    
        public void AddNewItem(A NewItem) {
           Check MasterListHere ????
        }
      }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是你仍然需要传递对实例的引用
      • @Jeremy:在编辑过程中抓住了我 :)
      【解决方案4】:

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

      【讨论】:

      • 我也考虑过...是否有一个访问修饰符会限制对嵌套类的访问?
      • 嗯,一种方法是将所有这些数据结构放入自己的程序集中并使用内部而不是私有。
      • 我考虑过,但它不会阻止其他类访问此列表。这不是超级关键,但我希望它尽可能干净......
      • 那么我认为 Alex 的解决方案可以。
      【解决方案5】:

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

      你有没有想过重新学习你的课程?您可以在 MainClass 中拥有它,而不是在 B 中拥有 AddNewItem 方法。这样就可以很容易地从 MainClass 中检查 MasterList。

      【讨论】:

        【解决方案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;
        }
        

        【讨论】:

        • 问题是我将有多个 B 实例,我会将 A 项添加到...
        • 我正在考虑做类似的事情,但也包括对 B 的引用.. 所以 public void AddItem(B list, A item) {}..
        • @Rob 多个实例在这种情况下很好,您只需要更改在 MainClass 中添加项目的方式,但这样您就不必担心 B 知道您的 MasterList。
        猜你喜欢
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        相关资源
        最近更新 更多