Consultando um desconhecido Tipo de interface
-
19-09-2019 - |
Pergunta
Neste código:
TTest<IntfT: IInterface> = class
protected
fObj : TInterfacedObject;
public
function GetVal: IntfT;
end;
Como eu poderia implementar a função GetVal se eu quero que ele retorne fObj como um IntfT?
Eu tentei:
result := fObj as IntfT;
e
fObj.QueryInterface(IntfT,result);
e
result := fObj as IInterface;
mas nada parece funcionar. Esta parece ser uma coisa tão simples, eu continuo pensando que deve estar faltando alguma coisa.
Todas as idéias?
Editar
O que parece ser o mais promissor para mim agora é QueryInterface. Atualmente o compilador reclama que IntfT não é um GUID e tenho a impressão de que se eu tivesse a GUID tudo apropriado seria feliz. Alguém sabe de uma maneira de obter a IID de um tipo de interface que iria trabalhar nesta situação?
Solução 2
Aqui está a solução que eu vim com:
function TTest<IntfT>.GetVal: IntfT;
begin
fObj.QueryInterface(GetTypeData(TypeInfo(T)).Guid,result);
end;
E isso parece funcionar. (BTW, ele funciona porque fObj não é realmente um TInterfacedObject, mas uma classe que implementa interface diferente que tem um método QueryInterface público).
Outras dicas
result := fObj as IntfT;
deve trabalhar, mas, aparentemente, o compilador não entendo muito bem interfaces como genéricos. Você deve relatar isso em QC.
fObj.QueryInterface(IntfT,result);
não funciona porque QueryInterface é um protegido membro da TInterfacedObject. Além disso, QueryInterface funciona chamando GetInterface, que olha para um GUID, e GUIDs e genéricos não se misturam muito bem.
result := fObj as IInterface;
faz direito de compilação para mim. Que problema você está tendo com ele?