Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Class 访问内部嵌套类中的外部类_Class_Nested_Pascal_Outer Join - Fatal编程技术网

Class 访问内部嵌套类中的外部类

Class 访问内部嵌套类中的外部类,class,nested,pascal,outer-join,Class,Nested,Pascal,Outer Join,这是一个对象Pascal,我想知道在不干扰外部实例指针并将其传递给内部的情况下,这是否可能 我想做的是使用内部方法获得对outter(ClassOne)类的完全访问权。 我一直在努力: { this class should be able to access by all clases inside it } ClassOne = class type { can be accessed by ClassThree, can access: ClassOne }

这是一个对象Pascal,我想知道在不干扰外部实例指针并将其传递给内部的情况下,这是否可能 我想做的是使用内部方法获得对outter(ClassOne)类的完全访问权。 我一直在努力:

{ this class should be able to access by all clases inside it }
ClassOne = class
    type
        { can be accessed by ClassThree, can access: ClassOne }
        ClassTwo = class
            type
                { can be accessed by / can access: ClassOne and ClassTwo }
                ClassThree = class 
                    public
                        procedure MethodOne();
                end;

            private
                FieldOne: Array[1 .. 10] of ClassThree;
                FieldTwo: integer;

            public
                procedure MethodOne();
        end;

    private
        FieldOne: Array[1 .. 5] of ClassTwo;
        FieldTwo: Byte;

    public
        procedure MethodOne(Something: Byte);
end;
实施:

procedure ClassOne.MethodOne(Something: Byte);
begin
    FieldTwo := Something;
end;    

procedure ClassOne.ClassTwo.MethodOne();
begin
    { does something but not important in this case }
end;

procedure ClassOne.ClassTwo.ClassThree.MethodOne();
begin
    { here i need the FieldTwo value of ClassOne of the current instance }
    ClassOne(self).FieldTwo; // Does not work
end;
访问:

var Test: ClassOne;

...

Test := ClassOne.Create();
Test.FieldOne[2] := ClassOne.ClassTwo.Create;
Test.FieldOne[2].FieldOne[5] := ClassOne.ClassTwo.ClassThree.Create;

Test.MethodOne(15);
Test.FieldOne[2].MethodOne();
Test.FieldOne[2].FieldOne[5].MethodOne();
迭代和数组大小只是随机的例子

我认为在Java中类似于
OuterClass.self.OuterClassField但这在这里不起作用。
我知道,这可以通过在创建后立即传递外部实例来实现,但这会给以后的构造函数和实例带来很多麻烦。
我怎样才能让它像那样工作

更新
也许这需要和祖先一起做?
这一个可以编译,但在调用class2或class3的构造函数后立即崩溃,为什么

ClassOne = class
    type
        ClassTwo = class(ClassOne) { changed ancestor }
            type
                ClassThree = class(ClassTwo) { changed ancestor }
                    public
                        procedure MethodOne();
                end;

            private
                FieldOne: Array[1 .. 10] of ClassThree;
                FieldTwo: integer;

            public
                procedure MethodOne();
        end;

    private
        FieldOne: Array[1 .. 5] of ClassTwo;
        FieldTwo: Byte;

    public
        procedure MethodOne(Something: Byte);
end;

好的,看来只有一种方法可以做到这一点,将外部类的和实例传递给内部类。
最好的方法是使用内部类构造函数。
这需要在每个嵌套类中包含一个实例的附加字段。
从这个级别,您可以完全访问outter类(甚至是严格的私有字段)。
下面是一个使用我上面文章中的类结构的简单示例:

Test := ClassOne.Create();

{ Test is a ClassTwo parent }
Test.FieldOne[2] := ClassOne.ClassTwo.Create(Test);

{ Test.FieldOne[2] is a ClassThree parent }
Test.FieldOne[2].FieldOne[5] := ClassOne.ClassTwo.ClassThree.Create(Test.FieldOne[2]);
然后,每个嵌套类都需要一个字段,即父字段:

{ ClassTwo }
Strict Private
    Parent: ClassOne;
    ...
    { ClassThree}
    Strict Private
        Parent: ClassTwo;
用法:

Procedure ClassOne.ClassTwo.ClassThree.Test();
Begin
    { Access ClassOne FieldTwo from ClassThree }
    Parent.Parent.FieldTwo;
End;

我不这么认为。例如,“嵌套类型可以访问其容器类的实例变量(字段、属性或方法),但必须有对象引用才能访问。”看起来您是对的,唯一的方法是将外部类的实例传递给内部类的构造函数。这给了我一个答案。