Cập nhật
Các câu hỏi ban đầu đã có một vấn đề mà tôi xác định (xem dưới đây). Tuy nhiên, sửa chữa tôi mô tả có tốt cho XE3 và sau đó, nhưng chương trình dưới đây không biên dịch trong XE2. Vì vậy, tôi kết luận rằng đây là một lỗi trình biên dịch Generics Generics.
Dù sao, đây là một cách giải quyết cho Delphi XE2:
{$APPTYPE CONSOLE}
type
IStorageObject = interface(IInterface)
end;
TObjectStorage<T: IStorageObject> = class(TObject)
end;
IKeyStorageObject<TKey> = interface(IStorageObject)
end;
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>, IStorageObject> = class(TObjectStorage<T>)
end;
TImplementingClass<TKey> = class(TInterfacedObject, IStorageObject, IKeyStorageObject<TKey>)
end;
begin
TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create;
end.
Original câu trả lời
Nó sẽ tốt hơn nếu bạn đã cung cấp một chương trình hoàn chỉnh trưng bày các lỗi biên dịch . Bạn cần cố gắng khởi tạo một đối tượng để xem lỗi đó.
Nhưng, tôi nghĩ rằng tôi đã sao chép sự cố của bạn. Vì vậy, tôi tin rằng vấn đề là mã này:
TKeyObjectStorage<TKey, T: IKeyStorageObject<TKey>> = ...
áp dụng các hạn chế chung cho cả hai TKey
và T
. Bây giờ, rõ ràng bạn chỉ muốn hạn chế để áp dụng cho T
vì vậy bạn sẽ cần phải viết:
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = ...
Dưới đây là một chương trình ngắn mà biên dịch sau sự thay đổi trong Delphi XE3:
{$APPTYPE CONSOLE}
type
IStorageObject = interface(IInterface)
end;
TObjectStorage<T: IStorageObject> = class(TObject)
end;
IKeyStorageObject<TKey> = interface(IStorageObject)
end;
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = class(TObjectStorage<T>)
end;
TImplementingClass<TKey> = class(TInterfacedObject, IKeyStorageObject<TKey>)
end;
begin
TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create;
end.
này khá là một sắc thái, việc thay đổi dấu phẩy thành dấu chấm phẩy. Lập trình bằng dấu chấm câu quan trọng không bao giờ thú vị nhiều. Điều đó nói rằng, bạn đã quen thuộc với sự khác biệt giữa dấu phẩy và dấu chấm phẩy trong danh sách tham số chính thức và vì vậy nó không nên đến quá nhiều bất ngờ để thấy sự phân biệt giống nhau được vẽ ở đây.
Các documentation không che tâm trí này, bạn:
Multiple Type Parameters
When you specify constraints, you separate multiple type parameters by semicolons, as you do with a parameter list declaration:
type
TFoo<T: ISerializable; V: IComparable>
Like parameter declarations, multiple type parameters can be grouped together in a comma list to bind to the same constraints:
type
TFoo<S, U: ISerializable> ...
In the example above, S
and U
are both bound to the ISerializable
constraint.
Bạn chỉ hoàn toàn thay đổi câu hỏi !!? Bạn vừa thay thế dấu phẩy đó bằng dấu chấm phẩy? !! Và mã bạn đăng vẫn không đủ để hiển thị lỗi.Vui lòng làm những gì tôi đề xuất và đăng ** chương trình hoàn chỉnh **. Tôi đã cho bạn thấy làm thế nào trong câu trả lời của tôi. –
Xin lỗi vì David này, Vâng tôi đã làm, nhưng ',' đã không ném một hoặc lỗi này và chỉ là một sự giám sát nhỏ. Sry lần nữa. – Hugie
@Hugie, Không thay đổi câu hỏi để đi chệch khỏi vấn đề ban đầu của nó. Bất kỳ lỗi nào trong nhu cầu ban đầu cần lưu lại trong câu hỏi; tuy nhiên tạo một ứng dụng giao diện điều khiển với mã tối thiểu để chứng minh sự cố. và dán ** ứng dụng giao diện điều khiển ** đó vào câu hỏi. – Johan