이것은 오브젝트 파스칼입니다. 외부 인스턴스 포인터를 엉망으로 만들고 내부로 전달하지 않고 어떻게 든 가능할지 궁금합니다.
내가하고 싶은 것은 내부 메서드를 사용하여 외부 (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;
좋아, 외부 클래스의 인스턴스를 내부 클래스에 전달하여 올바르게 수행하는 방법은 한 가지 뿐인 것 같습니다.
이를 수행하는 가장 좋은 장소는 내부 클래스 생성자입니다.
이를 위해서는 인스턴스를 보유하는 모든 중첩 클래스에 추가 필드가 필요합니다.
이 수준에서 외부 클래스 (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 중첩 클래스에는 부모라는 필드가 필요합니다.
{ 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;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다