Forum: Object-Pascal / Delphi-Language
Delphi
by Stevie,
11. Feb 2012
Hätt schwören können, da stand gestern was anderes, egal.
Hab nicht dran gedacht, dass beim Add in die TInterfaceList auch nen QueryInterface gemacht wird, also wird T dann wieder auf IInterface "gecastet". Das musst du dann beim Get wieder umdrehen:
function TGenericInterfaceList<T>.Get(Index: Integer): T;
begin
FInterfaces.QueryInterface(GetTypeData(TypeInfo(T)).Guid, Result);
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by Stevie,
10. Feb 2012
Nur, weil da TBlub.Create steht, wird noch lang kein TBlub in Add hineingegeben, sondern ein IBlub, denn das ist in diesem Fall T. Wenn eine Klasse A ein Interface B implementiert, sind Instanzen von Klasse A davon direkt zuweisungskompatibel zu Variablen vom Interface B.
Forum: Object-Pascal / Delphi-Language
Delphi
by Stevie,
10. Feb 2012
@Stahli: Da das Add von der generischen Liste ist, wird der Wert, der dort reingegeben wird, vom Typ T sein ;)
Lösung:
function TGenericInterfaceList<T>.Get(Index: Integer): T;
begin
Result := T(FInterfaces);
end;
Warum kein cast oder Supports? Na, weil das Interface, was du beim Add hineingibst, schon vom Typ T ist, was aber auch ein IInterface ist (Typeconstraint). Deshalb stehen in...
Forum: Object-Pascal / Delphi-Language
Delphi
by Stevie,
8. Feb 2012
Das konkrete Problem noch nie, aber nachdem ich den von dir geposteten Code kompiliert habe und bei beiden Prozeduren der Fehler kam, blieb ja nur noch die einzige Methode in der Klasse. Und dort fiel mir dann auf, dass ein IInterface in der Tat nicht zuweisungskompatibel zu einem IBlub ist :)
Forum: Object-Pascal / Delphi-Language
Delphi
by Stevie,
8. Feb 2012
Das ist das Problem:
function TGenericInterfaceList<T>.Get(Index: Integer): T;
begin
Result := FInterfaces;
end;