嵌套类 - 从父类调用嵌套类

5

我有一个类,其中一个方法调用了一个嵌套类。我想从嵌套类中访问父类属性。

public class ParentClass
{
    private x;
    private y;
    private z;

    something.something = new ChildClass();

    public class ChildClass
    {
        // need to get x, y and z;
    }
}

如何在子类中访问x、y和z?可能需要引用父类,但是怎么做呢?


感谢Zach展示代码 - 我在将代码放入时遇到了困难。 - insanepaul
4个回答

9
使用this关键字将一个对“自己”的引用传递给ChildClass的构造函数。
public class ParentClass
{
    public X;
    public Y;
    public Z;

    // give the ChildClass instance a reference to this ParentClass instance
    ChildClass cc = new ChildClass(this);

    public class ChildClass
    {
        private ParentClass _pc;

        public ChildClass(ParentClass pc) {
            _pc = pc;
        }

        // need to get X, Y and Z;
        public void GetValues() {
            myX = _pc.X
            ...
        }
    }
}

谢谢,这对我理解非常清楚。我不知道的是“this”关键字。 - insanepaul
"this" 在当前上下文中不可用? - Demodave
@Demodave ChildClass 定义在 ParentClass 内部,但它不是一个实例,因此您必须将对封闭实例的引用传递给子实例。 - Byron Ross

3

请参考http://www.codeproject.com/KB/cs/nested_csclasses.aspx,详细了解如何在C#中使用嵌套类。 我认为你正在寻找类似以下内容的东西:

class OuterClass
{
    public int y = 100;

    public class NestedClass
    {
        public static void abc()
        {
            OuterClass oc = new OuterClass();
            System.Console.WriteLine(oc.y);     
        }
    }
}

因此,为了访问外部类的字段,您需要在内部类中使用外部类的实例。

请记住,您可以在没有外部类实例的情况下从内部类访问静态字段:

class OuterClass
{
    public static int y = 100;

    public class NestedClass
    {
        public static void abc()
        {
            System.Console.WriteLine(OuterClass.y);     
        }
    }
}

他想从嵌套类中访问外部类的属性。相反,我认为你所做的只是再次实例化了外部类...然后访问了属性。 - Isaac E
你是正确的。正如Lucero或Isaac所提到的那样,你可能需要传递一个对外部类的现有引用。 - Justin Ardini
是的,这就是我一直在阅读的内容,但我如何创建一个现有的引用? - insanepaul

2

在嵌套类的构造函数中传入外部类的引用,这样你就可以从嵌套类中访问父类的属性。

此外,值得注意的是,父类的静态属性也是可用的。

http://en.csharp-online.net/Nested_Classes

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Application {
    class OuterClass {
        int someProperty = 10;

        class NestedClass {
            OuterClass reference;

            public NestedClass( OuterClass r ) {
                reference = r;
            }

            public void DoSomething( ) {
                Console.Write( reference.someProperty );
            }
        }

        public OuterClass( ) {
            NestedClass nc = new NestedClass( this );
            nc.DoSomething( );
        }
    }

    class Test {
        public static void Main( string[] args ) {
            OuterClass oc = new OuterClass( );
        }
    }
}

这就是我不明白的地方,我知道这很基础,但是我该如何传递一个引用到构造函数中。当然,我可以将父类添加到嵌套类的构造函数中,但是在调用子类构造函数的父类方法中我应该传递什么呢?我注意到我可以访问静态属性,但不幸的是我的静态属性都没有。 - insanepaul
为了更完整的回答,我发布了一个示例。 请注意,OuterClass构造函数正在创建一个新的NestedsClass,并且NestedClass正在访问OuterClass的属性“someProperty”。 - Isaac E
我是否需要从外部类构造函数创建一个新的嵌套类?我可以用外部类的方法使用'this'参数调用嵌套类的构造函数。例如... thing.ItemTemplate = new nestedclass(this); ...您可以看到所有工作都在嵌套类中完成,而来自外部类的方法则调用它。无论如何,我已经进行了快速检查,似乎一切正常。所以我只需要传入'this'关键字。 - insanepaul

2

您需要在ChildClass的构造函数中传入父类实例的引用。当然,如果这些字段是静态的,您可以访问ParentClass的字段。

注意:如果您曾经使用过Java,C#仅支持“静态”内部类的概念。


这就是我不明白的地方,我知道这很基础,但是我该如何传递一个引用到构造函数。当然,我可以将父类添加到嵌套类的构造函数中,但是在调用子类构造函数的父类方法中我应该传递什么呢?我注意到我可以访问静态属性,但不幸的是我的静态属性都没有。 - insanepaul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接