2012-06-05 37 views
6

Tôi đang cố gắng để viết một tài sản trong đó sử dụng Generics:tài sản sử dụng Generics trong Delphi

type TMyClass = class 
    protected 
    function GetCountBy<T: Class>: Integer; 
    public 
    property CountBy<T: Class>: Integer read GetCountBy<T>; 
    end; 

nhưng biên dịch không thành công trên tờ khai tài sản với thông điệp 'tài sản CountBy không tồn tại trong lớp cơ sở', và tiếng leng keng màu đỏ khi mở < của tên thuộc tính.

Có cách nào để đạt được điều này không?

Edit: Đây là trường hợp của tôi khác sử dụng, đó là phức tạp hơn nhưng hơn thế giới thực:

property ItemsBy<T: Class>[Index: Integer]: T read GetItemsBy<T> write SetItemsBy<T>; 

Chức năng lọc nội dung của một danh sách để trả lại món Index'th của lớp được chỉ định.

+0

Bạn chỉ cần TDictionary tại đây. Generics không phù hợp với vấn đề này. –

+0

-1. Đây sẽ là một câu hỏi tốt hơn nếu nó được thúc đẩy bởi một vấn đề mà thực sự sẽ được hưởng lợi từ Generics. Ví dụ "thuộc tính chung" trong câu hỏi không cần generics chút nào. Điều này có khả năng là một câu hỏi hay về việc hỏi cú pháp đúng cho các thuộc tính chung (nếu cú ​​pháp đó tồn tại), nhưng vấn đề ví dụ cần được giải quyết bằng cú pháp như vậy không thực sự chứng minh sự cần thiết. –

Trả lời

9

tính Generic không được hỗ trợ trong Delphi. Chỉ các lớp chung chung hoặc các phương thức chung chung.

Tôi không thể tìm thấy bất kỳ điều gì trong tài liệu nêu rõ ràng giới hạn đó. Mặt khác, tài liệu chỉ mô tả các lớp chung chung và các phương thức chung. Và new language grammar to support generics cũng không đề cập đến thuộc tính.

+1

Đó là chính xác. –

1

Tôi không lên đến tốc độ trên Generics nhưng không nên khai báo có nhiều như thế này

type TMyClass<T: class> = class 
    protected 
    function GetCountBy<T>: Integer; 
    public 
    property CountBy<T>: Integer read GetCountBy<T>; 
    end; 
+0

@Lieveb, lớp này chứa danh sách các đối tượng. Tôi muốn một tài sản để trả về một số đối tượng của một lớp học nhất định, vì vậy tôi không cần phải tự lớp học để 'genericalised', chỉ có tài sản Countby. (Tôi có thể làm điều này với một chức năng, nhưng tôi muốn thực hiện như là một tài sản). –

+6

@MikeSutton - Tại sao bạn lại sử dụng generics cho tất cả? Bạn không thể chỉ khai báo thuộc tính của mình là 'property CountBy [AClass: TClass]: Integer đọc GetCountBy;' –

+1

@Lieven: không, không nhất thiết. Một lớp bình thường có thể có các phương thức chung. Nhưng tôi không nghĩ rằng các đặc tính chung được cho phép theo cách này. Giải pháp duy nhất là làm cho lớp chung chung và thuộc tính KHÔNG chung chung. –

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