当前位置:  开发笔记 > 编程语言 > 正文

从嵌套类访问封闭类中的字段的最佳方法是什么?

如何解决《从嵌套类访问封闭类中的字段的最佳方法是什么?》经验,为你挑选了4个好方法。

假设我在表单中有一个下拉列表,并且我在此类中有另一个嵌套类.现在,从嵌套类访问此下拉列表的最佳方法是什么?



1> Ray Hayes..:

与Java不同,嵌套类不是特殊的"内部类",因此您需要传递引用.Raymond Chen有一个例子来描述这里的差异:C#嵌套类就像C++嵌套类,而不是Java内部类.

下面是一个示例,其中嵌套类的构造函数传递外部类的实例以供以后引用.

// C#
class OuterClass 
{
    string s;
    // ...
    class InnerClass 
    {
       OuterClass o_;
       public InnerClass(OuterClass o) { o_ = o; }
       public string GetOuterString() { return o_.s; }
    }
    void SomeFunction() {
        InnerClass i = new InnerClass(this);
        i.GetOuterString();
    }

}

请注意,InnerClass可以访问OuterClass的" s",我没有修改Raymond的代码(因为我链接到上面),所以请记住" string s;"是private因为没有指定其他访问权限.



2> Jon Skeet..:

嵌套类型与Java中的内部类不同 - 没有包含类型的固有实例.(它们更像是Java中的静态嵌套类.)它们实际上是独立的类,有两个区别:

如果包含类型是通用的,则嵌套类型由包含类型有效地参数化,例如Outer.Nested,不相同Outer.Nested.

嵌套类型可以访问包含类型中的私有成员.


(大约7年后......)您是否知道为什么外部类不能访问嵌套类的私有或受保护成员,就像嵌套类可以访问外部类成员一样?有时候这会有用,我想知道我的设计是否存在缺陷.
@GDS:我不知道为什么要做出设计决定,但这通常对我有意义.如果你将嵌套类设为私有,那么最好将成员设为内部或公共.

3> Jason Kresow..:

与Java不同,在C#中没有隐式引用封闭类的实例.

您需要将此类引用传递给嵌套类.执行此操作的典型方法是通过嵌套类的构造函数.

public partial class Form1 : Form
{
    private Nested m_Nested;

    public Form1()
    {
        InitializeComponent();

        m_Nested = new Nested(this);
        m_Nested.Test();
    }

    private class Nested
    {
        private Form1 m_Parent;

        protected Form1 Parent
        {
            get
            {
                return m_Parent;
            }
        }

        public Nested(Form1 parent)
        {
            m_Parent = parent;
        }

        public void Test()
        {
            this.Parent.textBox1.Text = "Testing access to parent Form's control";
        }
    }
}



4> Levite..:
静态成员

因为到目前为止还没有人提到它:根据你的情况,如果成员变量也可以是静态的,你可以通过以下方式访问它.

class OuterClass
{
    private static int memberVar;

    class NestedClass 
    {
        void SomeFunction() { OuterClass.memberVar = 42; }
    }
}

旁注:我有memberVar目的地(并且冗余地)标记private了嵌套类访问它的外部类的私有成员的给定能力.

小心/请考虑

某些情况下,这可能是获取访问权限的最简单方法/解决方法,但......

静态还意味着,变量将在所有实例对象之间共享,具有所有缺点/后果(线程安全等)

静态也意味着,如果你有多个父类的实例,并且变量应该为每个实例保存一个单独的值,这显然不会起作用

所以在大多数情况下你可能想采用不同的方法......

传递参考

正如大多数人所建议的那样(并且因为它也是最正确的答案),这里是一个将引用传递给外部类实例的示例.

class OuterClass
{
    private int memberVar;
    private NestedClass n;

    OuterClass()   { n = new NestedClass(this); }


    class NestedClass
    {
        private OuterClass parent;

        NestedClass(OuterClass p) { parent = p; }
        SomeFunction() { parent.memberVar = 42; }
    }
}

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有