2013-08-26 55 views
6

Tại sao sau đây tạo ra lỗi trong Delphi (XE)?Phương pháp gọi trên loại chung?

unit UTest; 

interface 


type 

TTest = class 
    public 
    procedure Foo<T>(A: T); 
end; 

implementation 

{ TTest } 

procedure TTest.Foo<T>(A: T); 
begin 
    A.Add('hej'); 
end; 

end. 

Tôi nghĩ rằng các loại chung trong Delphi chỉ đơn giản là được chèn vào hàm chung, vì vậy nó sẽ chỉ lỗi nếu được sử dụng với loại không có phương thức Thêm (chuỗi).

Trả lời

8

Mã của bạn tạo ra lỗi biên dịch vì trình biên dịch không có cách nào để biết rằng T có phương thức có tên là Add nhận một tham số chuỗi đơn.

Tôi nghĩ rằng các loại chung trong Delphi chỉ đơn giản là được chèn vào hàm chung, vì vậy nó sẽ chỉ lỗi nếu được sử dụng với loại không có phương thức Thêm (chuỗi).

Nếu bạn đang sử dụng mẫu Smalltalk hoặc C++ thì giả định của bạn sẽ chính xác. Tuy nhiên, generics không giống như các mẫu. Đối với Generics, bạn cần áp dụng một ràng buộc cho tham số kiểu. Các ràng buộc cần phải nói cho trình biên dịch những gì thuộc tính T phải có.

Ví dụ: bạn có thể hạn chế T để bắt nguồn từ một lớp có phương thức Add phù hợp. Hoặc bạn có thể hạn chế T để triển khai giao diện với phương thức Add phù hợp.

liên kết Tài liệu cho chế generic Delphi: http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

Các khó khăn chung có thể được áp dụng khá hạn chế, đó là một cái gì đó của một sự xấu hổ. Ví dụ, tôi muốn có thể hạn chế một loại để có một số toán tử toán học nhất định. Ví dụ: tôi muốn có thể hạn chế loại có các toán tử +-. Tuy nhiên, có những ưu và khuyết điểm đối với cả generics và template, và vì vậy tôi chấp nhận rằng những hạn chế này là kết quả của một quyết định thiết kế hợp lý của các nhà thiết kế ngôn ngữ Delphi.

+0

Lý do tôi muốn làm ở trên là tôi có hai lớp không chia sẻ một lớp cơ sở (hoặc giao diện) nhưng một số chữ ký phương thức giống hệt nhau. Tôi đoán điều này là không thể với những hạn chế hạn chế? – monoceres

+1

Điều đó là chính xác. Nếu đây là những mẫu bạn sẽ ổn. Nhưng bạn chỉ đơn giản là ra khỏi may mắn với Generics. Bạn đã nhấn cùng một vấn đề khiến tôi viết các thuật toán toán học tốt đẹp có thể hoạt động trên cả hai giá trị vô hướng và phức tạp. –

+1

Đó là quá xấu: (Tôi đoán tôi sẽ phải hoàn nguyên về RTTI và if-statements (blersh) – monoceres