Po prostu próbowałem mojego pierwszego użycia generycznych w Delphi 2009 i jestem zakłopotany, w jaki sposób użyć typu ogólnego jako wejścia do funkcji Supports używanej do sprawdzenia, czy obiekt implementuje dane berło. Stworzyłem małą próbkę ilustrującą problem.Używanie funkcji Support() z typowym interfejsem typu
Biorąc pod uwagę następujące rodzaje i użytkową funkcję:
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;
i następujący fragment kodu:
class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;
myInterface := GetInterface<IMyInterface>(myObject);
end;
spodziewałbym żadnych problemów, ale pojawia się następujące błędy kompilacji czas:
[Błąd DCC] GenericExample.pas (37): E2029 '(' oczekiwano, ale ',' znaleziono [Błąd DCC] Generuj icExample.pas (37): E2014 komunikat z oczekiwaniami, ale wyrażenie typu „T” Znaleziono
Nie jestem pewien, co kompilator spodziewa mi zrobić z T stosowany jako rzeczywisty argument funkcji .
Szukałem sporo i nie byłem w stanie go złamać. Część mnie podejrzewa, że gdybym mógł zrozumieć, w jaki sposób nazwa interfejsu zostanie przekształcona w IID: typ TGUID podczas kompilacji, używając konkretnej nazwy interfejsu, mógłbym zrobić pewne postępy, ale to mnie również omija.
Każda pomoc jest doceniana.
Nie można zastosować ograniczenia, że T musi być określonym interfejsem z identyfikatorem GUID? –
Jeśli musi to być jakiś interfejs, kod nie jest generyczny. Obsługa zwróci odniesienie do interfejsu; kompilator nie może generalnie zmienić tego na dowolne T. –
Barry, dzięki za pomoc. Większość mojego doświadczenia z podstawowym programowaniem pochodzi z języka C++ i spodziewałem się, że kompilator będzie wiedział, czy interfejs ma Guid w taki sam sposób, w jaki będzie wiedział, czy nazwa interfejsu została podana bezpośrednio. Ma to sens teraz wiedząc, że generyczne szablony <> C++. Dzięki jeszcze raz. – Chad