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

时间:2013-12-28 11:51:04

标签: class nested pascal outer-join

这是一个Object 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;,但这在这里不起作用 这可以通过在创建之后立即传递外部实例来完成,我知道,但是这会对构造函数和实例造成很多麻烦。
我怎样才能让它像那样工作?

更新
也许这需要与祖先一起完成? 这个编译但在调用ClassTwo或ClassThree的构造函数后立即崩溃,为什么?

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;

1 个答案:

答案 0 :(得分:1)

好吧,通过将outter类的实例传递给内部类,看起来只有一种方法可以做到这一点。
最好的地方是内部类构造函数 这需要在每个嵌套类中包含一个附加字段,该字段包含一个实例 从这个级别,您可以完全访问outter类(甚至是Strict Private字段) 使用上面帖子中的类结构的一个简单示例:

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]);

然后,evey嵌套类需要一个字段,即名为Parent:

{ 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;