Tôi vừa thử sử dụng Generics đầu tiên trong Delphi 2009 và bị lúng túng về cách sử dụng kiểu chung làm đầu vào cho hàm Hỗ trợ được sử dụng để xem một đối tượng có thực hiện hay không giao diện. Tôi đã tạo một mẫu nhỏ minh họa vấn đề.Sử dụng chức năng Hỗ trợ() với kiểu giao diện chung
Với chủng loại và hữu ích sau đây chức năng:
IMyInterface = interface
['{60F37191-5B95-45BC-8C14-76633826889E}']
end;
TMyObject = class(TInterfacedObject, IMyInterface)
end;
class function TFunctions.GetInterface<T>(myObject: TObject): T;
var
specificInterface: T;
begin
// This would compile, but looses the generic capability
//Supports(myObject, IMyInterface, specificInterface);
// This results in compile errors
Supports(myObject, T, specificInterface);
result := specificInterface;
end;
và đoạn mã sau:
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
tôi mong chờ không có vấn đề nhưng tôi nhận được lỗi thời gian biên dịch sau:
[Lỗi DCC] GenericExample.pas (37): E2029 '(' được mong đợi nhưng ',' tìm thấy [Lỗi DCC] Tạo icExample.pas (37): Dự báo E2014, nhưng biểu thức loại 'T' được tìm thấy
Tôi không chắc chắn trình biên dịch mong đợi tôi làm gì với T khi được sử dụng làm đối số thực tế cho hàm .
Tôi đã tìm kiếm xung quanh một chút và không thể giải quyết vấn đề này. Một phần của tôi nghi ngờ rằng nếu tôi có thể hiểu làm thế nào một tên giao diện được chuyển đổi sang IID: TGUID loại trong quá trình biên dịch, khi sử dụng một tên giao diện cụ thể, tôi có thể thực hiện một số headway, nhưng điều đó đã trốn tôi cũng.
Bất kỳ trợ giúp nào được đánh giá cao.
bạn có thể không áp dụng một ràng buộc rằng T phải là một số giao diện được chỉ định có GUID không? –
Nếu nó cần phải là một số giao diện, sau đó mã không phải là chung chung. Hỗ trợ sẽ trả về một tham chiếu giao diện; trình biên dịch không thể biến đổi nó thành bất cứ thứ gì T là. –
Barry, cảm ơn sự giúp đỡ của bạn. Phần lớn kinh nghiệm của tôi với lập trình chung là từ nền C++, và tôi mong rằng trình biên dịch sẽ biết nếu một giao diện có một Hướng dẫn giống như cách nó sẽ biết nếu tên giao diện được cung cấp trực tiếp. Nó có ý nghĩa hoàn hảo khi biết rằng các mẫu Generics <> C++. Cảm ơn một lần nữa. – Chad