Umwandeln eines Objekts in einen Schnittstellentyp ohne TInterfacedObject als Basisklasse
Ich brauche eine Klasse implementierende Schnittstelle ohne Referenzzählung. Ich habe folgendes gemacht:
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;
Fehlende Referenzzählung funktioniert gut. Aber ich mache mir Sorgen, dass ich nicht wirken kannTMyClass
zuIMyInterface
mitas
Operator:
var
MyI: IMyInterface;
begin
MyI := TMyClass.Create as IMyInterface;
Ich bin gegeben
[DCC-Fehler] E2015 Operator gilt nicht für diesen Operandentyp
Das Problem verschwindet wennTMyClass
kommt vonTInterfacedObject
- d. h. ich kann ein solches Casting ohne Compilerfehler durchführen. Offensichtlich möchte ich TInterfacedObject nicht als Basisklasse verwenden, da dadurch meine Klassenreferenz gezählt würde. Warum ist ein solches Casting nicht erlaubt und wie kann man es umgehen?