Ho bisogno di un'interfaccia di implementazione di classe senza il conteggio dei riferimenti. Ho fatto quanto segue:Lancio dell'oggetto al tipo di interfaccia senza TInterfacedObject come classe base
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 mancanza di conteggio dei riferimenti funziona correttamente. Ma la mia preoccupazione è che non posso lanciare TMyClass
-IMyInterface
utilizzando as
operatore:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
mi viene data
[DCC errore] E2015 Operatore non applicabile a questo tipo di operando
Il il problema scompare quando TMyClass
deriva da TInterfacedObject
, ovvero posso eseguire tale operazione senza errore del compilatore. Ovviamente non voglio usare TInterfacedObject come una classe base in quanto renderebbe contato il riferimento alla mia classe. Perché questo casting non è consentito e come si potrebbe aggirarlo?
È possibile ottenere risultati migliori aggiungendo un GUID alla dichiarazione dell'interfaccia. Aggiungi una nuova riga dopo la riga '= interface' e premi Ctrl-Shft-G. 'as',' GetInterface' e 'supports' ecc devono essere in grado di identificare l'interfaccia tramite GUID per funzionare. –
Non hai letto attentamente il mio post. quando provengo da TInterfacedObject funziona. GUID non ha nulla da fare qui. È necessario GUID solo per operare con COM. –
Hmm, quale versione di Delphi? –