Convertir el objeto en un tipo de interfaz sin TInterfacedObject como clase base
Necesito una interfaz de implementación de clase sin recuento de referencias. Hice lo siguiente:
IMyInterface = interface(IInterface)
['{B84904DF-9E8A-46E0-98E4-498BF03C2819}']
procedure InterfaceMethod;
end;
TMyClass = class(TObject, IMyInterface)
protected
function _AddRef: Integer;stdcall;
function _Release: Integer;stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
public
procedure InterfaceMethod;
end;
procedure TMyClass.InterfaceMethod;
begin
ShowMessage('The Method');
end;
function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TMyClass._AddRef: Integer;
begin
Result := -1;
end;
function TMyClass._Release: Integer;
begin
Result := -1;
end;
La falta de conteo de referencias funciona bien. Pero mi preocupación es que no puedo lanzar.TMyClass
aIMyInterface
utilizandoas
operador:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
Me dan
[Error DCC] El operador E2015 no se aplica a este tipo de operando
El problema desaparece cuandoTMyClass
deriva deTInterfacedObject
- Es decir, puedo hacer ese casting sin error de compilación. Obviamente, no quiero usar TInterfacedObject como clase base, ya que haría que mi referencia de clase contara. ¿Por qué no se permite tal lanzamiento y cómo se podría solucionarlo?