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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage