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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top