2011-07-04 5 views
5

여기있는 사람은 델파이가 절차에 대한 참조를 어떻게 표현하는지 알고 있습니까? 우리가 "시저"에있어 무엇을 TProc 및 참조의 내부 (메모리) 표현

var 
    proc: TProc; 
... 
proc = procedure begin beep end; 

예를

에 대한

?

"메소드 변수"의 경우 메모리 주소는 "프로 시저 주소"에 4 바이트, "객체 주소"에 대해서는 4 바이트이지만 "프로 시저에 대한 참조"에 대해서는 다소 다르다는 것을 알고 있습니다. 그것.

내가 원하는 이유는 레거시 코드에서 참조와 함께 사용하기를 원하기 때문입니다.

아무도 알고 있나요?

+1

http://alex.ciobanu.org/?p=27 –

+2

일반적으로 '참조 절차'는 특수 컴파일러 생성 인터페이스 변수에 보관됩니다. 이렇게하면 참조 카운트되므로 참조가 남아 있지 않을 때 캡처 된 변수를 정리할 수 있습니다. '참조 (reference) '를 사용하기 위해 구현 방법을 알 필요가 없습니다. 그래서 컴파일러를 가지고 있습니다. –

답변

10

메서드 참조는 메서드 참조와 동일한 서명이있는 Invoke이라는 단일 메서드를 사용하여 COM 스타일 인터페이스로 구현됩니다.

그래서 TProc은 다음과 같습니다

type 
    TProc = interface(IInterface) // so inherits QI, AddRef, Release 
    procedure Invoke; 
    end; 

델파이는 C++ 제품과의 상호 운용성이 있기 때문에 그것은, 물어 유효한 질문입니다. 이미 존재하는 레퍼런스 카운트 형 및 관용구 (COM 수명 규칙)를 사용하면 메소드 참조 레벨에서 C++과 interop이 가능합니다.

익명 메소드는 메소드 참조 인터페이스와 동일한 인터페이스 즉, 정확히 동일한 모양이지만 동일한 기호 식별 정보를 사용하지 않는 인터페이스를 구현하는 숨겨진 클래스를 생성합니다. 숨겨진 클래스는 인터페이스를 여러 번 구현해야하기 때문에 메서드 참조 인터페이스를 직접 구현하지 않습니다. 단일 블록에는 모두 동일한 메서드 참조 유형의 위치에 할당 된 여러 개의 익명 메서드가 포함될 수 있습니다.

+0

알아두면 좋았습니다. Barry Kelly 고맙습니다. – Nedko

+1

@ 배리 : 언제나처럼 재미 있습니다! 마지막 단락을 여러 번 읽어야했는데 이해할 것 같아요. 이것은 바보 같은 질문 일지 모르지만, 괄호로 묶인 섹션은 메서드 참조 숨겨진 클래스의 한 인스턴스가 여러 개의 익명 메서드를 구현하기 위해 만들어졌으며 여러 개의 익명 메서드가 모두 동일한 일반 프로 시저에서 정의되어 있다는 것을 의미합니다. 다른 범위)? 그건 들리지만 ... 복잡한 :) –

+2

@David 익명 메소드는 지역 변수를 캡처 할 수 있습니다; 동일한 변수를 모두 캡처하는 여러 익명 메소드가있을 때 상태를 공유해야합니다. Delphi의 구현은 블록의 익명 메소드와 관련된 모든 상태 (즉 캡처 된 변수)를 동일한 객체에 넣습니다. 모든 익명 메소드는이 객체의 클래스에 대한 메소드로 바뀌고 캡처 된 모든 변수는 필드로 바뀝니다. –