2014-05-04 23 views
6

Trên blog của Chris: http://delphihaven.wordpress.com/2011/07/14/weird-in-more-ways-than-one/vấn đề gì "tài liệu tham khảo để" giải quyết

tôi thấy đoạn mã sau

type 
    TLinkVisitor<T> = reference to procedure(const Item: T); 

    TDoubleLinked<T> = record 
    Prev: ^TDoubleLinked<T>; 
    Next: ^TDoubleLinked<T>; 
    Value: T; 
    class function Create(const aValue: T): Pointer; static; 
    function Add(const aValue: T): Pointer; 
    procedure Delete; 
    procedure DeleteAll; 
    function First: Pointer; 
    function Last: Pointer; 
    procedure ForEach(const Proc: TLinkVisitor<T>); 
    end; 

vấn đề gì các 'tài liệu tham khảo để' từ khóa giải quyết mà không thể được thực hiện với một bình thường thủ tục kiểu?

Trả lời

11

Với một thủ tục reference bạn có thể sử dụng:

  • Một quy trình truyền thống, hoặc
  • Một phương pháp của một đối tượng, lớp hoặc hồ sơ, hoặc
  • Một phương pháp vô danh.

Đó là khả năng làm việc với các phương pháp ẩn danh đặt ra các thủ tục reference ngoài tất cả các loại thủ tục khác. Và những gì đặt các phương thức nặc danh ngoài các thủ tục hoặc các kiểu phương thức khác là việc nắm bắt biến đổi.

Để có cuộc thảo luận chi tiết hơn, hãy tham khảo câu trả lời này: What is the difference between of object and reference to?. Tài liệu chính thức cho các phương pháp vô danh cũng đáng đọc.

4

Theo tài liệu chính thức, vấn đề (cần giải quyết) là các phương thức nặc danh là các loại được quản lý, trong khi các biến thủ tục thì không.
Từ khóa 'tham chiếu đến' tổng quát hơn các loại thủ tục khác.

Đây là cách doc đặt nó: phương pháp http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html

Anonymous thường được gán cho một cái gì đó, như trong ví dụ sau:

myFunc := function(x: Integer): string 
begin 
    Result := IntToStr(x); 
end; 

myProc := procedure(x: Integer) 
begin 
    Writeln(x); 
end; 

phương pháp Anonymous cũng có thể được trả lại bởi chức năng hoặc được chuyển thành giá trị cho các tham số khi gọi phương thức. Ví dụ, bằng cách sử dụng phương pháp biến MyFunc nặc danh được xác định ngay trên:

type 
    TFuncOfIntToString = reference to function(x: Integer): string; 

procedure AnalyzeFunction(proc: TFuncOfIntToString); 
begin 
    { some code } 
end; 

// Call procedure with anonymous method as parameter 
// Using variable: 
AnalyzeFunction(myFunc); 

// Use anonymous method directly: 
AnalyzeFunction(function(x: Integer): string 
begin 
    Result := IntToStr(x); 
end;) 

Phương pháp tài liệu tham khảo cũng có thể được giao cho các phương pháp cũng như phương pháp vô danh. Ví dụ:

type 
    TMethRef = reference to procedure(x: Integer); 
TMyClass = class 
    procedure Method(x: Integer); 
end; 

var 
    m: TMethRef; 
    i: TMyClass; 
begin 
    // ... 
    m := i.Method; //assigning to method reference 
end; 

Tuy nhiên, ngược lại là không đúng: bạn không thể gán một phương pháp vô danh với một con trỏ phương pháp thông thường. Tham chiếu phương thức là các kiểu được quản lý, nhưng các con trỏ phương thức là các kiểu không được quản lý. Vì vậy, vì lý do an toàn kiểu, việc gán tham chiếu phương thức cho con trỏ phương thức không được hỗ trợ. Ví dụ, các sự kiện là các thuộc tính có giá trị con trỏ của phương thức, vì vậy bạn không thể sử dụng một phương thức nặc danh cho một sự kiện. Xem phần liên kết biến để biết thêm thông tin về hạn chế này.

+1

Bạn đang thiếu một trong những tính năng chính quan trọng nhất của các phương pháp ẩn danh có tính năng chụp biến. Những thứ khác như di chuyển xung quanh hoặc trả lại chúng có thể được thực hiện với các con trỏ hàm thường xuyên nhưng không thể thay đổi. –

+0

Cảm ơn @StefanGlienke vì đã chỉ ra điều đó. Tôi đã quên tất cả về điều đó. Tất nhiên tất cả những điều này xảy ra trên đống quy tắc ra công cụ này cho mã tốc độ cao. – Johan

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