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ử +
và -
. 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.
Nguồn
2013-08-26 14:29:20
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
Đ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. –
Đó là quá xấu: (Tôi đoán tôi sẽ phải hoàn nguyên về RTTI và if-statements (blersh) – monoceres