这是一个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;
答案 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;