2011-07-04 25 views
5

Có ai ở đây biết Delphi đại diện cho một tham chiếu đến thủ tục không?Nội bộ (bộ nhớ) đại diện của TProc và tài liệu tham khảo tại tất cả

ví dụ

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

sao chúng ta có gì trong "proc"?

Tôi biết rằng đối với "biến phương thức" biểu diễn bộ nhớ là 4 byte cho "địa chỉ thủ tục", tiếp theo là 4 byte cho "địa chỉ đối tượng", nhưng "tham chiếu đến thủ tục" hơi khác và tôi không thể nó ra.

Lý do tôi muốn điều này là do tôi có một số mã cũ mà tôi muốn làm cho nó hoạt động với các tham chiếu.

Có ai biết gì về điều này không?

+1

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

+2

Nói chung 'tham chiếu đến thủ tục' được tổ chức trong một biến giao diện được tạo ra bởi trình biên dịch đặc biệt. Điều này đảm bảo rằng nó được tính tham chiếu để các biến bị bắt có thể được dọn dẹp khi không còn tham chiếu. Bạn không cần phải biết nó được thực hiện như thế nào để làm việc với 'reference to'. Đó là lý do tại sao bạn có một trình biên dịch. –

Trả lời

10

Tham chiếu phương pháp được triển khai dưới dạng giao diện kiểu COM với một phương thức được gọi là Invoke, có cùng chữ ký với tham chiếu phương pháp.

Vì vậy TProc trông như thế này:

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

Đó là một câu hỏi hợp lệ để hỏi, như Delphi có khả năng tương tác với sản phẩm C++. Bằng cách sử dụng kiểu và thành phần được tính toán tham chiếu đã tồn tại từ trước (quy tắc toàn thời gian COM), có thể tương tác với C++ ở mức tham chiếu phương thức.

Phương thức ẩn danh tạo lớp ẩn thực hiện giao diện đẳng cấu với giao diện tham chiếu phương thức, nghĩa là chính xác cùng một hình dạng, nhưng không có cùng một biểu tượng nhận dạng. Lớp ẩn không thực hiện trực tiếp giao diện tham chiếu phương thức vì nó có thể cần triển khai giao diện nhiều lần (một khối đơn có thể chứa nhiều phương thức ẩn danh được gán cho các vị trí của cùng kiểu tham chiếu phương thức).

+0

Thật tuyệt khi biết. Cảm ơn Barry Kelly. – Nedko

+1

@Barry: Thú vị như mọi khi! Tôi đã phải đọc đoạn cuối cùng nhiều lần, nhưng tôi nghĩ tôi hiểu. Đây có thể là một câu hỏi ngớ ngẩn, tôi sợ, nhưng: phần khung có nghĩa là một thể hiện của một lớp tham chiếu phương thức được tạo ra để thực hiện nhiều phương thức nặc danh, trong đó một số được định nghĩa trong cùng một thủ tục bình thường (hoặc giống nhau phạm vi khác)? Điều đó nghe có vẻ phức tạp :) –

+2

@David các phương thức ẩn danh có thể nắm bắt các biến cục bộ; khi bạn có nhiều phương thức nặc danh, tất cả đều chụp cùng một biến, chúng cần chia sẻ trạng thái. Việc triển khai của Delphi đặt tất cả trạng thái (tức là các biến bị bắt) được liên kết với các phương thức nặc danh trong một khối vào cùng một đối tượng; mọi phương thức nặc danh được biến thành một phương thức trên lớp của đối tượng này, trong khi mọi biến bị bắt biến thành một trường. –

Các vấn đề liên quan